Перестали работать роботы на MT5 - страница 2 123456 Новый комментарий Kudrev 2019.09.24 16:19 #11 #property copyright "Sergey Vladimirov" #property link "https://login.mql5.com/ru/users/Sergey_Mechanic/portfolio" #property version "1.20" #include <Trade/Trade.mqh> enum ENUM_SIGNAL { SHORT = -1, NONE = 0, LONG = 1 }; // inputs sinput string i_sMA1Settings = "=== Параметры МА1 ==="; // input uint i_nMA1Period = 10; // Период input ENUM_MA_METHOD i_eMA1Method = MODE_SMA; // Тип input ENUM_APPLIED_PRICE i_eMA1Price = PRICE_CLOSE; // Цена для расчёта sinput string i_sSeparator1 = ""; // sinput string i_sMA2Settings = "=== Параметры МА2 ==="; // input uint i_nMA2Period = 20; // Период input ENUM_MA_METHOD i_eMA2Method = MODE_SMA; // Тип input ENUM_APPLIED_PRICE i_eMA2Price = PRICE_CLOSE; // Цена для расчёта sinput string i_sSeparator2 = ""; // sinput string i_sEASettings = "=== Параметры советника ==="; // input double i_fLot = 1; // Лот input int i_nMagic = 3245; // Идентификатор (Magic Number) // globals int g_hMA1Handle = 0; int g_hMA2Handle = 0; double g_fMA1[]; double g_fMA2[]; CTrade g_oTrade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(i_nMA1Period == 0 || i_nMA2Period == 0 || i_nMA1Period > i_nMA2Period) { string sErr = "Периоды обеих МА должны быть больше нуля, и период МА1 должен быть меньше периода МА2. \nОткорректируйте введённые значения."; MessageBox(sErr, "Некорректные параметры!"); Print(sErr); return(INIT_FAILED); } g_hMA1Handle = iMA(Symbol(), Period(), i_nMA1Period, 0, i_eMA1Method, i_eMA1Price); g_hMA2Handle = iMA(Symbol(), Period(), i_nMA2Period, 0, i_eMA2Method, i_eMA2Price); ArrayResize(g_fMA1, 3); ArrayResize(g_fMA2, 3); ZeroMemory(g_fMA1); ZeroMemory(g_fMA2); ArraySetAsSeries(g_fMA1, true); ArraySetAsSeries(g_fMA2, true); g_oTrade.SetDeviationInPoints(200); g_oTrade.SetExpertMagicNumber(i_nMagic); g_oTrade.SetTypeFilling(OrderTypeFilling(Symbol())); NewBar(0, true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { datetime dtTime[1]; CopyTime(Symbol(), Period(), 0, 1, dtTime); // совершаем сделки только на опен бара if(NewBar(dtTime[0]) == true) { // копируем значения мувингов CopyBuffer(g_hMA1Handle, 0, 0, 3, g_fMA1); CopyBuffer(g_hMA2Handle, 0, 0, 3, g_fMA2); // вычисляем сигнал (пересечение мувингов) ENUM_SIGNAL eSignal = NONE; if(g_fMA1[1] > g_fMA2[1] && g_fMA1[2] <= g_fMA2[2]) eSignal = LONG; else if(g_fMA1[1] < g_fMA2[1] && g_fMA1[2] >= g_fMA2[2]) eSignal = SHORT; if(eSignal == NONE) return; // проверяем, есть ли уже открытая сделка bool bBuyIsOpen = false; bool bSellIsOpen = false; if(PositionSelect(Symbol()) == true) { if(HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)) == true) { ulong nLastDealTicket = 0; for(int i = 0; i < HistoryDealsTotal(); i++) { ulong nDealTicket = HistoryDealGetTicket(i); if(HistoryDealGetInteger(nDealTicket, DEAL_MAGIC) == i_nMagic && nDealTicket > nLastDealTicket) { if(HistoryDealGetInteger(nDealTicket, DEAL_TYPE) == DEAL_TYPE_BUY) { bBuyIsOpen = true; bSellIsOpen = false; } else if(HistoryDealGetInteger(nDealTicket, DEAL_TYPE) == DEAL_TYPE_SELL) { bBuyIsOpen = false; bSellIsOpen = true; } else continue; nLastDealTicket = nDealTicket; } } } } // сигнал на покупку, и нет открытой покупки if(eSignal == LONG && bBuyIsOpen == false) { double fLot = i_fLot; // если открыт шорт - переворачиваем позицию (покупаем удвоенным лотом) if(bSellIsOpen == true) fLot *= 2; MqlTick oTick; ZeroMemory(oTick); SymbolInfoTick(Symbol(), oTick); // покупаем if(g_oTrade.Buy(fLot, Symbol(), oTick.ask) == true && g_oTrade.ResultOrder() > 0) { // дожидаемся результата сделки WaitForOrderInHistory(g_oTrade.ResultOrder()); } } // сигнал на продажу, и нет открытой продажи if(eSignal == SHORT && bSellIsOpen == false) { double fLot = i_fLot; // если открыт шорт - переворачиваем позицию (покупаем удвоенным лотом) if(bBuyIsOpen == true) fLot *= 2; MqlTick oTick; ZeroMemory(oTick); SymbolInfoTick(Symbol(), oTick); // продаём if(g_oTrade.Sell(fLot, Symbol(), oTick.bid) == true && g_oTrade.ResultOrder() > 0) { // дожидаемся результата сделки WaitForOrderInHistory(g_oTrade.ResultOrder()); } } } } //+------------------------------------------------------------------+ bool NewBar(const datetime dtTime, const bool bReset = false) { bool bRetVal = false; static datetime s_dtLastBarTime = 0; if(bReset == true) { s_dtLastBarTime = 0; return(false); } if(dtTime > s_dtLastBarTime && s_dtLastBarTime > 0) bRetVal = true; s_dtLastBarTime = dtTime; return(bRetVal); } //+------------------------------------------------------------------+ // разрешённый тип заливки ордеров ENUM_ORDER_TYPE_FILLING OrderTypeFilling(const string sSymbol) { ENUM_ORDER_TYPE_FILLING eRetVal; int nFillingFlags = (int)SymbolInfoInteger(sSymbol, SYMBOL_FILLING_MODE); if((nFillingFlags & SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK) eRetVal = ORDER_FILLING_FOK; else if((nFillingFlags & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) eRetVal = ORDER_FILLING_IOC; else eRetVal = ORDER_FILLING_RETURN; return(eRetVal); } //+------------------------------------------------------------------+ void WaitForOrderInHistory(ulong nResultOrder) { return; if(nResultOrder>0) { // дождёмся появления ордера nResultOrder в истории while(!IsStopped()) { if(HistoryOrderSelect(nResultOrder)==true) break; Sleep(10); } } } //+------------------------------------------------------------------+ Slava 2019.09.24 16:25 #12 Попробуйте в настройках тестирования задать валюту депозита RUB Kudrev 2019.09.24 16:37 #13 Slava: Попробуйте в настройках тестирования задать валюту депозита RUB С первого раза нет эффекта. Перезагрузил комп из за обновления винд.10. Попробовал и сейчас все работает. СПАСИБО БОЛЬШОЕ. Kudrev 2019.09.24 16:43 #14 Рано радовался. Открывает 1 сделку и все работа заканчивается Evgeniy Zhdan 2019.09.24 18:14 #15 Kudrev: Рано радовался. Открывает 1 сделку и все работа заканчивается Вспомнилось - "не долго музыка играла, не долго фраер танцевал." Думаю, проблема с брокером - не исполняет поступающие приказы от советника. Slava 2019.09.24 20:06 #16 Kudrev: Рано радовался. Открывает 1 сделку и все работа заканчивается И чем это объясняется? В логах тестера что написано? Или вы так до сих пор логи и не читаете? Slava 2019.09.24 20:08 #17 Evgeniy Zhdan: Вспомнилось - "не долго музыка играла, не долго фраер танцевал." Думаю, проблема с брокером - не исполняет поступающие приказы от советника. При чем здесь брокер? Речь о тестере. И о клубе телепатов. Kudrev 2019.09.25 19:47 #18 Slava: И чем это объясняется? В логах тестера что написано? Или вы так до сих пор логи и не читаете? Kudrev 2019.09.25 19:52 #19 Все нашел причину. Спасибо всем большое. Я сам оказывается дурак. Kudrev 2019.09.26 17:31 #20 Slava: При чем здесь брокер? Речь о тестере. И о клубе телепатов. Снова ошибки. Робот так и не заработал 123456 Новый комментарий
Попробуйте в настройках тестирования задать валюту депозита RUB
С первого раза нет эффекта. Перезагрузил комп из за обновления винд.10. Попробовал и сейчас все работает.
СПАСИБО БОЛЬШОЕ.
Рано радовался. Открывает 1 сделку и все работа заканчивается
Вспомнилось - "не долго музыка играла, не долго фраер танцевал."
Думаю, проблема с брокером - не исполняет поступающие приказы от советника.
Рано радовался. Открывает 1 сделку и все работа заканчивается
И чем это объясняется? В логах тестера что написано? Или вы так до сих пор логи и не читаете?
Вспомнилось - "не долго музыка играла, не долго фраер танцевал."
Думаю, проблема с брокером - не исполняет поступающие приказы от советника.
При чем здесь брокер? Речь о тестере.
И о клубе телепатов.
И чем это объясняется? В логах тестера что написано? Или вы так до сих пор логи и не читаете?
Все нашел причину. Спасибо всем большое.
Я сам оказывается дурак.
При чем здесь брокер? Речь о тестере.
И о клубе телепатов.
Снова ошибки. Робот так и не заработал