1. Нельзя открывать ордера в функции init().(В тестере еще прокатит, но уже на демо работать не будет)
2. Когда закрываете ордера, считать надо с конца к началу, а не наоборот, как у Вас.
Спасибо за ответ. В этом случае исследовалась работа оператора цикла именно в тестере, поэтому ордера открыты в init() для упрощения, в реальных экспертах такого не бывает. Изменение порядка выбора ордеров действительно приводит к их закрытию в течении одного тика (код программы и отчёт из журнала тестера привожу ниже). Мне кажется странным, что в MQL4 нельзя выбирать порядок работы с ордерами, если вы знаете почему подскажите, пожалуйста, т.к. по логике работы эксперта я собираюсь закрывать ордера именно в порядке их открытия.
С уважением. Shurkin.
Код программы.
//+------------------------------------------------------------------+//| Poligon1.mq4 |//| 21 февраля 2013 года. |//|Тестирование оператора цикла for. |//+------------------------------------------------------------------+#property copyright "21 февраля 2013 года."#property link ""//+------------------------------------------------------------------+//|Объявленные переменные |//+------------------------------------------------------------------+int Mn=357;//Magic numberint i;//Показатель счётчика итерацийdouble PriTP;//TP серииint Tick;//Счётчик тиков//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//----Установка серии ордеровOrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMITOrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP//----
PriTP=Bid;//PriTPPrint("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение//----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
//----
Tick++;//Tick// Print("Кс1:"," Tick=",Tick);//Сообщение//----// for(i=0;i<OrdersTotal();i++)//Инициализация циклаfor(i=OrdersTotal()-1; i>=0; i--)//
{
Print("Кс2:"," Tick=",Tick," i=",i);//Сообщениеif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
{
if(OrderSymbol()==Symbol())//Символ
{
if(OrderMagicNumber()==Mn)//Идентификационное число
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
}//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}//Закрыто if(OrderMagicNumber()==Mn)
}//Закрыто if(OrderSymbol()==Symbol()
}//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}//Закрыто for(i=0;i<OrdersTotal();i++)//----return(0);
}
//+------------------------------------------------------------------+
Записи в журнале тестера.
2013.03.0813:28:19 Poligon1 EURUSD,M15: removed
2013.03.0810:14:142013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=3 i=02013.03.0810:14:142013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=3 i=12013.03.0810:13:502013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=2 i=02013.03.0810:13:502013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=2 i=12013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.33952013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=1 i=02013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.33952013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=1 i=12013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.33952013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=1 i=22013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.33952013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=1 i=32013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.33952013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=1 i=42013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=1 i=52013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс2: Tick=1 i=62013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: Кс0: OrdersTotal=72013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok2013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok2013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok2013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok2013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok2013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok2013.03.0810:13:262013.02.1112:15 Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok2013.03.0810:13:26 Poligon1 test started
2013.03.0810:13:24 Poligon1 EURUSD,M15: loaded successfully
Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к ордеру?...
На примере. Родной комментарий e121220_3in1 01
С допиской ДЦ после ролловера
e121220_3in1 01[swap]
То есть, если ищешь ордер по комментарию, надо предварительно определить длину строки "родного" комментария и при поиске проверять только первую часть измененного комментария соответствующей длины. Или проверять вхождение родной строки в проверяемый комментарий.
Спасибо за ответ. В этом случае исследовалась работа оператора цикла именно в тестере, поэтому ордера открыты в init() для упрощения, в реальных экспертах такого не бывает. Изменение порядка выбора ордеров действительно приводит к их закрытию в течении одного тика (код программы и отчёт из журнала тестера привожу ниже). Мне кажется странным, что в MQL4 нельзя выбирать порядок работы с ордерами, если вы знаете почему подскажите, пожалуйста, т.к. по логике работы эксперта я собираюсь закрывать ордера именно в порядке их открытия.
С уважением. Shurkin.
Логика правильная - порядковых номеров позиций у ордеров должно быть столько сколько ордеров, как только один закрыли, все остальные пересчитались. Попробуйте такую конструкцию
for(i=0, int k=0; i<OrdersTotal();i++,k++)//
{
Print("Кс2:"," Tick=",Tick," i=",i);//Сообщениеif(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
{
if(OrderSymbol()==Symbol())//Символ
{
if(OrderMagicNumber()==Mn)//Идентификационное число
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
k--;
}//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}//Закрыто if(OrderMagicNumber()==Mn)
}//Закрыто if(OrderSymbol()==Symbol()
}//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}//Закрыто for(i=0;i<OrdersTotal();i++)
Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к ордеру?
Заранее спасибо.
Имело место полное изменение комментария ордера. Также, при частичном закрытии, иногда обнуляется magic (частичное закрытие инициируется сервером). Сейчас, для контроля последнего висит отдельный, зацикленный советник, который контролирует "чужие" ордера и прочие несоответствия, своевременно извещая Push сообщениями.
Подскажите, пожалуйста, что может являться причиной возникновения следующей проблемы.
Есть индикатор, использующий внешние функции. Код откомпилированной библиотеки находится в папке libraries, описатели - в include.
Подключение #include <lib_Zemckikh.mqh>. При первом просчете индикатора все библиотечные функции работают штатно, индикатор отображается на графике. Стоит сменить параметры (заставить повторно просчитать индикатор) вызова библиотечных функций не происходит, индикатор не отображается, на вкладке "Эксперты" после смены параметров никаких записей нет.
Если же убрать подключение библиотеки и нужные функции поместить в файл индикатора (откомпилировать сразу с функциями) все работает штатно.
Не могу понять, что сделано не так. Что бы не засорять форум, коды не прикладываю. Если будет необходимо, сброшу в личку.
Господа!Подскажите пожалуйста как закодировать(вероятно в условном операторе) простую идею
-если сделка закрылась по стоп-лоссу
-по цене стоп-лосса открыть другую сделку
Спасибо
1. Нельзя открывать ордера в функции init().(В тестере еще прокатит, но уже на демо работать не будет)
2. Когда закрываете ордера, считать надо с конца к началу, а не наоборот, как у Вас.
Спасибо за ответ.
В этом случае исследовалась работа оператора цикла именно в тестере, поэтому ордера открыты в init() для упрощения, в реальных экспертах такого не бывает.
Изменение порядка выбора ордеров действительно приводит к их закрытию в течении одного тика (код программы и отчёт из журнала тестера привожу ниже).
Мне кажется странным, что в MQL4 нельзя выбирать порядок работы с ордерами, если вы знаете почему подскажите, пожалуйста, т.к. по логике работы эксперта я собираюсь закрывать ордера именно в порядке их открытия.
С уважением. Shurkin.
Именно по цене стоп-лосса не сможете открыть, но поставить условие открыть в том же или обратном направлении можно!
Вот Вам вызов функции из "Полезных функций" от Кима, который можете поставить в условие:
isCloseLastPosByStop - Возвращает флаг закрытия последней позиции по стопу
if(isCloseLastPosByStop() == 0) или ... == 1) и что хотите .....
Функцию найдёте здесь: https://www.mql5.com/ru/forum/131859
И поставьте её за пределами старта!
И убедительная просьба! Всё это можете делать Вы сами, приложив старание, аккуратность и терпение, иначе на подсказках ничему не научитесь!
Знания приобретаются только с адекватными с Вашей стороны усилиями! Входите в ежедневную пытливую работу! Удачи!
Доброго времени суток.
Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к ордеру?
Заранее спасибо.
Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к ордеру?...
Родной комментарий
e121220_3in1 01
С допиской ДЦ после ролловера
e121220_3in1 01[swap]
То есть, если ищешь ордер по комментарию, надо предварительно определить длину строки "родного" комментария и при поиске проверять только первую часть измененного комментария соответствующей длины. Или проверять вхождение родной строки в проверяемый комментарий.
Shurkin:
Спасибо за ответ.
В этом случае исследовалась работа оператора цикла именно в тестере, поэтому ордера открыты в init() для упрощения, в реальных экспертах такого не бывает.
Изменение порядка выбора ордеров действительно приводит к их закрытию в течении одного тика (код программы и отчёт из журнала тестера привожу ниже).
Мне кажется странным, что в MQL4 нельзя выбирать порядок работы с ордерами, если вы знаете почему подскажите, пожалуйста, т.к. по логике работы эксперта я собираюсь закрывать ордера именно в порядке их открытия.
С уважением. Shurkin.
Логика правильная - порядковых номеров позиций у ордеров должно быть столько сколько ордеров, как только один закрыли, все остальные пересчитались. Попробуйте такую конструкцию
Доброго времени суток.
Подскажите пожалуста, бывают ли ситуации, когда ДЦ могут изменить или удалить коментарии к ордеру?
Заранее спасибо.
Имело место полное изменение комментария ордера. Также, при частичном закрытии, иногда обнуляется magic (частичное закрытие инициируется сервером). Сейчас, для контроля последнего висит отдельный, зацикленный советник, который контролирует "чужие" ордера и прочие несоответствия, своевременно извещая Push сообщениями.
Подскажите пожалуйста как правильно написать условие:
1.если ордер символ = символ и ордер магик = 135
2.если нет отложенных ордеров БАЙСТОП
3.если нет открытых ордеров БАЙ ИЛИ (если есть) стоплосс>цены открытия
4.если цена находится между МА и есть фрактал up
СТАВИМ ОТЛОЖЕННЫЙ ОРДЕР BUYSTOP
НАПИСАЛ ВОТ ТАК:
НЕ РАБОТАЕТ!ПОДСКАЖИТЕ ЧЁМ ОШИБКА!
Подскажите, пожалуйста, что может являться причиной возникновения следующей проблемы.
Есть индикатор, использующий внешние функции. Код откомпилированной библиотеки находится в папке libraries, описатели - в include.
Подключение #include <lib_Zemckikh.mqh>. При первом просчете индикатора все библиотечные функции работают штатно, индикатор отображается на графике. Стоит сменить параметры (заставить повторно просчитать индикатор) вызова библиотечных функций не происходит, индикатор не отображается, на вкладке "Эксперты" после смены параметров никаких записей нет.
Если же убрать подключение библиотеки и нужные функции поместить в файл индикатора (откомпилировать сразу с функциями) все работает штатно.
Не могу понять, что сделано не так. Что бы не засорять форум, коды не прикладываю. Если будет необходимо, сброшу в личку.