Олигофрена си тиMateev wrote: ↑02 Jun 2018, 22:41Публикувам кода на двата експерта и на класа към тях, въпреки че не е завършен напълно. Правя го това най-вече заради олигофрена saxsten, който не спира да плещи простотии и да ръси обиди или измислици, които живеят само в неговия птичи мозък.
Обещах в почивните дни да напиша кода на стратегията на Knestin и днес от ранни зори само това правя. За съжаление не успях да го завърша, а трябва да си лягам, че утре имам други важни ангажименти. Останаха недонаписани още 3 метода, които ще се опитам да ги завърша утре вечер или в понеделник вечер.
Ето кода на класа с търговската логика:Code: Select all
//+------------------------------------------------------------------+ //| Strategy.mqh | //| Copyright 2018, Mateev SC | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, Rosimir Mateev" #property link " " #property version "1.01" #property strict //==================================================================== // Клас, описващ функционалноста на една стратегия по логиката на Knestin от форума Trader.bg class CStrategy { private: //Частни променливи и методи, видими само вътре в класа string symbol; // Валутна двойка, върху която ще работи стратегията int SL,TP; // Stop Loss и Take Profit на позициите в пипсове (4 знака) int Magic; // Уникален идентификатор на ордерите на стратегията double OpenHour; // Часа на отваряне на позицията double OpenPeriod; // Период за отваряне в часове (не трябва да се прехвърля в следващото денонощие) double LivePeriod; // Живот на позициите в часове // Статус на стратегията (на какъв етап от цикъла се намира) // 0 - Няма отворени позиции. Чака се настъпването на времето за отваряне на нови позиции. // 1 - Времето за отваряне е настъпило. Отварят се една BUY и една SELL позиции. // 2 - Позициите са отворени. Чака се настъпването на времето за затваряне. // 3 - Времето за затваряне е настъпило. Започва затварянето на позициите. int State; // Статус на стратегията int OpenPositionsCount(); // Сканира отворените позиции и връща техния брой void CheckForOpen(); // Проверява дали е настъпил момента за отваряне на позиции. Ако да, сменя статуса на експерта. void CheckForClose(); // Проверява дали е настъпил момента за затваряне на позиции. Ако да, сменя статуса на експерта. void OpenPositions(); // Отваря една Buy и една Sell позиции. Сменя статуса, ако отварянето е успешно. void ClosePositions(); // Затваря активните позиции. Сменя статуса, ако затварянето е успешно. public: // Публични променливи и методи, видими за външните програми CStrategy(); // Конструктор на класа ~CStrategy(); // Деструктор на класа // Инициализиране на параметрите на стратегията void SetSymbol(string sym){symbol=sym;}; // Инициализира валутната двойка void SetMagic (int value) {Magic=value;}; // Инициализира Magic Number на позициите void SetSL (int value) {SL=value;}; // Инициализира Stop Loss на позициите void SetTP (int value) {TP=value;}; // Инициализира Take Profit на позициите void SetOpenHour (double value); // Инициализира часа на отваряне на позицията void SetOpenPeriod(double value); // Инициализира периода за отваряне в часове (не трябва да се прехвърля в следващото денонощие) void SetLivePeriod(double value); // Инициализира живота на позициите в часове // Други методи void Run(); // Стартира логиката на стратегията }; //==================================================================== // Конструктор на класа. Извиква се автоматично при създаването на нов обект на класа. CStrategy::CStrategy() { // При създаването на обекта всички променливи автоматично сe инициализират със стойност 0, // а всички стрингове и указатели към обекти - със стойност NULL. // Ако случайно не се направи никаква външна инициализация, // то тогава стратегията ще работи със следните стойности по подразбиране: symbol = Symbol(); SL = 300; TP = 600; OpenHour = 14.0; // Начало на периода за отваряне на позиции - 14:00 часа OpenPeriod = 0.5; // Продължителност на периода за отваряне на позиции - половин час LivePeriod = 5.0; // Живот на позициите - 5 часа (до 19:00 часа) if(OpenPositionsCount()>0) State = 2; // 2 - Позициите са отворени. Чака се настъпването на времето за затваряне. } //-------------------------------------------------------------------- // Деструктор на класа. Извиква се автоматично преди унищожаването на обекта на класа. CStrategy::~CStrategy() { // При унищожаване на обекта динамичната памет, заета от стринговете, се освобождава автоматично. } //==================================================================== // Инициализира часа на отваряне на позицията void CStrategy::SetOpenHour(double value) { OpenHour = value; if (OpenHour < 0.0) OpenHour = 0.0; if (OpenHour > 23.9) OpenHour = 23.9; // Проверка дали края на периода се прехвърля в следващото денонощие if (OpenHour + OpenPeriod >= 24) OpenPeriod = 23.999 - OpenHour; } //==================================================================== // Инициализира периода за отваряне в часове // Не трябва да е по-къс от 1 минута и по-дълъг от 1 час // Не трябва да се прехвърля в следващото денонощие void CStrategy::SetOpenPeriod(double value) { OpenPeriod = value; if (OpenPeriod < 0.017) OpenPeriod = 0.017; // Около 1 минута if (OpenPeriod > 0.999) OpenPeriod = 0.999; // Малко по-малко от 1 час // Проверка дали края на периода се прехвърля в следващото денонощие if (OpenHour + OpenPeriod >= 24) OpenPeriod = 23.999 - OpenHour; } //==================================================================== // Инициализира живота на позициите в часове // Не трябва да е по-къс от 1 час void CStrategy::SetLivePeriod(double value) { LivePeriod = value; if (LivePeriod < 1.0) LivePeriod = 1.0; // 1 час } //==================================================================== // Сканира отворените позиции и връща техния брой int CStrategy::OpenPositionsCount() { int count = 0; // Брой на отворените позиции int total = OrdersTotal(); // Общ брой на всички отворени ордери в терминала for (int pos=0; pos<total; pos++) { if(!OrderSelect(pos,SELECT_BY_POS)) continue; // Има някаква грешка при селектването на този ордер от списъка if(OrderMagicNumber()!=Magic) continue; // Ордера не е от текущата стратегия if(OrderSymbol()!=symbol) continue; // Ордера не е по текущия символ count++; } return(count); } //==================================================================== // Проверява дали е настъпил момента за отваряне на позиции. Ако да, сменя статуса на стратегията. void CStrategy::CheckForOpen() { if(State!=0) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 0. datetime now = TimeLocal(); // Чете текущото време // Определя времената t1 и t2 на периода, в който е разрешено отварянето на 2 нови позиции MqlDateTime day; TimeToStruct(now,day); day.hour = int(OpenHour); day.min = int((OpenHour-day.hour)*60); // Извличане на минутите от часа, който може и да не е цяло число day.sec = 0; datetime t1 = StructToTime(day); // Време на началото на периода datetime t2 = t1 + int(OpenPeriod * 3600); // Време на края на периода // Проверка дали момента now е между времената t1 и t2 if((now>=t1) && (now<t2)) State = 1; // Вече е настъпило времето за отваряне на позиция и затова State става равно на 1. } //==================================================================== // Отваря една Buy и една Sell позиции. Сменя статуса, ако отварянето е успешно. void CStrategy::OpenPositions() { if(State!=1) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 1. // Отваряне на Buy позиция // Отваряне на Sell позиция if (OpenPositionsCount()==2) State = 2; } //==================================================================== // Проверява дали е настъпил момента за затваряне на позиции. Ако да, сменя статуса на експерта. void CStrategy::CheckForClose() { if(State!=2) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 2. // Проверка дали е настъпил момента за затваряне // Ако да, сменя статуса от 2 на 3 } //==================================================================== // Затваря активните позиции. Сменя статуса, ако затварянето е успешно. void CStrategy::ClosePositions() { if(State!=3) return; // Неправилно извикване на функцията. Трябва да се извиква само когато State = 3. // Затваря позициите, без да проверява за грешка. // Ако някоя от тях не се затвори поради някаква причина, на следващия тик ще се направи нов опит. // Проверка дали позициите са затворени коректно, и ако да - сменя се статуса на 0. if (OpenPositionsCount()==0) State = 0; } //==================================================================== // Стартиране на логиката на стратегията void CStrategy::Run() { // Ако търговията не е разрешена, приключваме обработката. if(!IsTradeAllowed()) return; // Извикват се различни функции в зависимост от последния статус на стратегията switch(State) { case 0: CheckForOpen(); break; // Няма отворени позиции. Чака се периода от време за отваряне. case 1: OpenPositions(); break; // Времето за отваряне е настъпило. Отварят се 2 позиции. case 2: CheckForClose(); break; // Има отворени позиции. Чака се времето за затваряне. case 3: ClosePositions(); break; // Времето за затваряне е настъпило. Затварят се позициите. } }
Ето кода на експерта, който търгува само върху един символ - този, върху който е пуснат:
Ето кода на експерта, който може да търгува по много символи едновременно:Code: Select all
//+------------------------------------------------------------------+ //| KnestinS.mq4 | //| Copyright 2018, Mateev SC | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, Rosimir Mateev" //#property link "" //#property version "1.01" #property strict #property description "Стратегия на Knestin от форума Trader.bg, със следната логика:" #property description "1. В 14:00 се откриват Sell и Buy позиции с фиксиран SL и TP" #property description "3. В 19:00 се закриват и двете позиции, ако все още са активни" #property description "Модификация от Mateev, за да е удобно тестването с различни параметри:" #property description "1. Времето за отваряне на позиции е абсолютно и става параметър" #property description "2. Въвежда се период от време, през който могат да се отварят позиции" #property description "3. Въвежда се период от време, след който позициите трябва да се затворят" #property description "4. Експерта работи върху текущия символ" #include "Strategy.mqh" // Клас с кода на една стратегия //==================================================================== // Параметри на експерта, които могат да се настройват в прозореца Inputs input double OpenHour = 14.0; // Час на отваряне на позициите input double OpenPeriod = 0.5; // Период за отваряне в часове input double LivePeriod = 5.0; // Живот на позициите в часове input int Magic = 1; // Magic Number input int SL = 300; // Stop Loss in points input int TP = 600; // Take Profit in points //==================================================================== // Глобални променливи на експерта CStrategy Strategy; // Обект на класа CStrategy //==================================================================== // Инициализация на експерта int OnInit() { // Инициализиране на параметрите на стратегията Strategy.SetSymbol(Symbol()); Strategy.SetMagic(Magic); Strategy.SetSL(SL); Strategy.SetTP(TP); Strategy.SetOpenHour (OpenHour); Strategy.SetOpenPeriod(OpenPeriod); Strategy.SetLivePeriod(LivePeriod); // Създаване на обект на таймер с период от 1 секунда EventSetTimer(1); return(INIT_SUCCEEDED); } //==================================================================== // Деинициализация на експерта (изтриване на обектите в динамичната памет) void OnDeinit(const int reason) { // Унищожаване (изтриване) на обекта на таймера EventKillTimer(); // Тъй като обектите на двете стратегии са статични, // то техния деструктор се извиква автоматично при деинициализацията на експерта } //==================================================================== // Стартира се на всеки тик void OnTick() { Strategy.Run(); // Стартиране на логиката на стратегията } //==================================================================== // Стартира се всяка секунда void OnTimer() { Strategy.Run(); // Стартиране на логиката на стратегията } //====================================================================
Трите файла ги запишете в една и съща директория (напримр в Experts/Knestin). Разгледайте кода и ако искате, можете да се опитате сами да го завършите. Слагал съм коментари в изобилие, за да може лесно да се разбере какво точно прави този код.Code: Select all
//+------------------------------------------------------------------+ //| KnestinМ.mq4 | //| Copyright 2018, Mateev SC | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, Rosimir Mateev" //#property link "" //#property version "1.01" #property strict #property description "Стратегия на Knestin от форума Trader.bg, със следната логика:" #property description "1. В даден час се откриват Sell и Buy позиции с фиксиран SL и TP" #property description "3. В друг час се закриват и двете позиции, ако все още са активни" #property description "Модификация от Mateev:" #property description "1. Въвежда се период от време T1-T2, през който могат да се отварят позиции" #property description "2. Въвежда се период от време T3, след който позициите трябва да се затворят" #property description "3. Експерта търгува в паралел по много символи" #include "Strategy.mqh" // Клас с кода на една стратегия //==================================================================== // Параметри на стратегиите, с които търгува този експерт #define STRATEGY_COUNT 2 // Брой на стратегиите, с които търгува този експерт CStrategy Strategy [STRATEGY_COUNT]; // Масив от обекти на класа CStrategy, които отработват логиката на различните стратегии string StrategySymbol[STRATEGY_COUNT]; // Валутни двойки на стратегиите int StrategyMagic [STRATEGY_COUNT]; // Magic Number на стратегиите int StrategySL [STRATEGY_COUNT]; // Stop Loss in Points на позициите от стратегиите int StrategyTP [STRATEGY_COUNT]; // Take Profit in Points на позициите от стратегиите double OpenHour [STRATEGY_COUNT]; // Час на отваряне на позициите double OpenPeriod [STRATEGY_COUNT]; // Период за отваряне в часове (не трябва да се прехвърля в следващото денонощие) double LivePeriod [STRATEGY_COUNT]; // Живот на позициите в часове //==================================================================== // Инициализация на експерта int OnInit() { // Инициализиране на параметрите на стратегия 0 StrategySymbol[0] = "EURUSD"; // Валутни двойки на стратегиите StrategyMagic [0] = 1000; // Magic Number на стратегиите StrategySL [0] = 300; // Stop Loss in Points на позициите от стратегиите StrategyTP [0] = 600; // Take Profit in Points на позициите от стратегиите OpenHour [0] = 14.0; // Час на отваряне на позициите OpenPeriod [0] = 0.5; // Период за отваряне в часове LivePeriod [0] = 5.0; // Живот на позициите в часове // Инициализиране на параметрите на стратегия 1 StrategySymbol[1] = "AUDUSD"; // Валутни двойки на стратегиите StrategyMagic [1] = 1001; // Magic Number на стратегиите StrategySL [1] = 250; // Stop Loss in Points на позициите от стратегиите StrategyTP [1] = 500; // Take Profit in Points на позициите от стратегиите OpenHour [1] = 14.0; // Час на отваряне на позициите OpenPeriod [1] = 0.5; // Период за отваряне в часове LivePeriod [1] = 5.0; // Живот на позициите в часове // Инициализиране на параметрите на стратегия 2, 3, 4 .... N // .................................... // Прехвърляне на информацията в обектите на стратегиите for (int i=0; i<STRATEGY_COUNT; i++) { Strategy[i].SetSymbol (StrategySymbol[i]); Strategy[i].SetMagic (StrategyMagic [i]); Strategy[i].SetSL (StrategySL [i]); Strategy[i].SetTP (StrategyTP [i]); Strategy[i].SetOpenHour(OpenHour [i]); Strategy[i].SetOpenPeriod(OpenPeriod [i]); Strategy[i].SetLivePeriod(LivePeriod [i]); } // Създаване на обект на таймер с период от 1 секунда EventSetTimer(1); return(INIT_SUCCEEDED); } //==================================================================== // Деинициализация на експерта (изтриване на обектите в динамичната памет) void OnDeinit(const int reason) { // Унищожаване (изтриване) на обекта на таймера EventKillTimer(); // Тъй като обектите на двете стратегии са статични, // то техния деструктор се извиква автоматично при деинициализацията на експерта } //==================================================================== // Стартира се на всеки тик void OnTick() { for (int i=0; i<STRATEGY_COUNT; i++) Strategy[i].Run(); } //==================================================================== // Стартира се всяка секунда void OnTimer() { for (int i=0; i<STRATEGY_COUNT; i++) Strategy[i].Run(); } //====================================================================
Ако някой успее да подкара на практика налудничавите неща на които казваш че били ескперти нека ми се обади за да го почерпя едно кафе.
От както се появи тука форума се напълни с идиотщини
Най-неприятното е че не може да ти се обясни нищо и къде бъркаш защото си луд и неадекватен олигофрен на когото каквото и да му кажеш все няма да го разбере
Наистина ама наистина си тотално изкукуригал и нямаш понятие от практическо програмиране
Както вече казах луд човек и олигофрен като Матеев кодове не пише