А внимательней на цикл перебора ордеров посмотреть?
i и j зачем путаете?
Исправьте путаницу, а дальше, думаю, справитесь сами.
На будущее: переменную цикла можно использовать в другом цикле, если предыдущий цикл завершился, и циклы друг в друга не вложены.
j не нужна.
А внимательней на цикл перебора ордеров посмотреть?
i и j зачем путаете?
Исправьте путаницу, а дальше, думаю, справитесь сами.
На будущее: переменную цикла можно использовать в другом цикле, если предыдущий цикл завершился, и циклы друг в друга не вложены.
j не нужна.
Не подскажете по коду ? Я исправил, сделки открываются и закрываются(после вашей помощи) правильно, но когда срабатывает тейк профит, почему-то, скрипт видит что ордер все еще открыт, как можно исправить ?
Немного модифицированный код:
//+------------------------------------------------------------------+ //| RoboV3.2.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //----1 double LOT=0.01; int MAPER=10; int MASHIFT=2; double Spread= NormalizeDouble(0.0001,Digits); int i; double MA[]; ArrayResize(MA,MAPER,10); ArrayInitialize(MA,EMPTY_VALUE); string MYSYMBOL=_Symbol; double ICLOSE=iOpen(MYSYMBOL,PERIOD_H1,0); double Free=AccountFreeMargin(); double One_Lot =MarketInfo(MYSYMBOL,MODE_MARGININIT); double Min_Lot =MarketInfo(MYSYMBOL,MODE_MINLOT); for (i = 0;i<(MAPER-1); i++) { MA[i]= iMA(MYSYMBOL,NULL,MAPER,MASHIFT,MODE_EMA,PRICE_OPEN,i); } //----1 //----2 for(int j=0;j<=OrdersTotal();j++) { if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==true) {Print ("Есть открытый ордер !***","Type:", OrderType(),"***","Ticket:",OrderTicket()); } else Print ("Ошибка выделения ордера Type:",OrderType(),"Ticket",OrderTicket(),"Error:", GetLastError() ); // if(OrderSymbol()!=Symbol()) continue; //--- check order type if(OrderType()==OP_BUY) { Print ("Есть открытый лонг !***"); if(Open[1]>MA[0] && Close[1]< MA[0]) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White)) Print("OrderClose error ",GetLastError()); else Print("Order LONG Закрылся !!! "); } break; } if(OrderType()==OP_SELL) { if(Open[1]<MA[0] && Close[1]>MA[0]) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White)) Print("OrderClose error ",GetLastError()); else Print("Order SELL Закрылся !!! "); } break; } } if (OrdersTotal()<1) { if ((MA[0]<Open[0]) && MA[0] > Open[1] ) // Событие для покупки { Print("Сигнал на лонг сработал"); int ticket1 = OrderSend(MYSYMBOL,OP_BUY,LOT,Ask,Spread,Ask-0.008,Ask+0.008,"My order",16384,0,clrRed); if(ticket1 <0) { Print("OrderSendOpenLong завершилась с ошибкой #",ticket1,GetLastError()); } else Print("Функция OrderSendOpenLong успешно выполнена #",ticket1); } if ((Open[0]<MA[0]) && Open[1] > MA[0] ) // Событие для продажи { Print("Сигнал на шорт сработал"); int ticket2=OrderSend(MYSYMBOL,OP_SELL,LOT,Bid,Spread,Bid+0.008,Bid-0.008,"My order",16384,0,clrBlue); if(ticket2 <0) { Print("OrderSendOpenShort завершилась с ошибкой # ",ticket2,GetLastError()); } else Print("Функция OrderSendOpenShort успешно выполнена# ",ticket2); } } //----2 //----3 } //+------------------------------------------------------------------+
Лог журнала:
2016.02.19 09:54:53.026 2015.01.22 22:00 Robot-3.3 GBPUSD,H1: Есть открытый лонг !*** 2016.02.19 09:54:53.026 2015.01.22 22:00 Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051 2016.02.19 09:54:52.962 2015.01.22 21:00 Robot-3.3 GBPUSD,H1: Есть открытый лонг !*** 2016.02.19 09:54:52.962 2015.01.22 21:00 Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051 2016.02.19 09:54:52.898 2015.01.22 20:00 Robot-3.3 GBPUSD,H1: Есть открытый лонг !*** 2016.02.19 09:54:52.898 2015.01.22 20:00 Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051 2016.02.19 09:54:52.834 2015.01.22 19:00 Robot-3.3 GBPUSD,H1: Есть открытый лонг !*** 2016.02.19 09:54:52.834 2015.01.22 19:00 Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051 2016.02.19 09:54:52.770 2015.01.22 18:00 Robot-3.3 GBPUSD,H1: Есть открытый лонг !*** 2016.02.19 09:54:52.770 2015.01.22 18:00 Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051 2016.02.19 09:54:52.706 2015.01.22 17:00 Robot-3.3 GBPUSD,H1: Есть открытый лонг !*** 2016.02.19 09:54:52.706 2015.01.22 17:00 Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051 2016.02.19 09:54:52.706 2015.01.22 17:00 Tester: take profit #7 at 1.50505 (1.50499 / 1.50501) 2016.02.19 09:54:52.642 2015.01.22 16:00 Robot-3.3 GBPUSD,H1: Есть открытый ордер !***Type:1***Ticket:7 2016.02.19 09:54:52.578 2015.01.22 15:00 Robot-3.3 GBPUSD,H1: Функция OrderSendOpenShort успешно выполнена# 7 2016.02.19 09:54:52.578 2015.01.22 15:00 Robot-3.3 GBPUSD,H1: open #7 sell 0.01 GBPUSD at 1.51305 sl: 1.52105 tp: 1.50505 ok
Не подскажете по коду ? Я исправил, сделки открываются и закрываются(после вашей помощи) правильно, но когда срабатывает тейк профит, почему-то, скрипт видит что ордер все еще открыт, как можно исправить ?
У вас странная логика советника в целом. Вы, видимо, кусками откуда-то себе понатаскали и склеили всё воедино.
Продумайте изначально, с чистого листа, саму структуру и общую логику советника.
Я бы рекомендовал следующий вариант:
- Получаем значения MA в массив
- Если есть ордер(а), сопровождаем их (ставим безубыток, закрываем если появилось условие на закрытие и т.д.)
- Иначе, если нет ордеров, то смотрим, имеются ли условия для их открытия (сравниваем MA с Open, и т.д.)
for(int j=0;i<=OrdersTotal();j++)
или jjj или iii
нужно <
Работаю оба варианта !!!:
<
и
if (OrdersTotal()>0) { for(int j=0;j<OrdersTotal();j++) ... }
При использовании ошибка пропадает.
Спасибо большое вам Vasyl Nosal и
Работаю оба варианта !!!:
и
При использовании ошибка пропадает.
Если так
if (OrdersTotal()>0) { for(int j=0;j<OrdersTotal();j++) ...
то это не нужно
if (OrdersTotal()>0)
{
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте. Код открывает и закрывает ордера, но не обрабатывает открытые ордера.
В коде сделан принт в журнал "Есть открытый ордер !***", "Ошибка выделения ордера***", но ни одна запись не выводится. Прошу подсказать в чем ошибка, что открытые ордера не обрабатываются ?