Прошу совета по MQL4

 
Только-только начал осваивать MQL4. Пытаюсь написать свой советник. Никак не могу решить одну задачу:

Допустим у меня открыты ордера "buy1", "buy2", "buy3", и стоят отложенные "buy4", "buy5", "buy6". Не могу написать скрипт, который бы закрывал все эти ордера, при пробитии одного из них Тейк-профит.

Помогите пожалуйста новичку. Заранее благодарен за ответы.
 
xgnom:
Только-только начал осваивать MQL4. Пытаюсь написать свой советник. Никак не могу решить одну задачу:

Допустим у меня открыты ордера "buy1", "buy2", "buy3", и стоят отложенные "buy4", "buy5", "buy6". Не могу написать скрипт, который бы закрывал все эти ордера, при пробитии одного из них Тейк-профит.

Помогите пожалуйста новичку. Заранее благодарен за ответы.


"пробитии одного из них Тейк-профит" это круто)

Тут 2 последовательных действа: узнать что ордер закрылся по ТП, и в случае этого закрыть все. В чем конкретно сложность?

 
Figar0:


"пробитии одного из них Тейк-профит" это круто)

Тут 2 последовательных действа: узнать что ордер закрылся по ТП, и в случае этого закрыть все. В чем конкретно сложность?



Сложность именно в том, как выразить эти два действия!))

У меня сейчас все выглядит примерно так:

если(бла-бла-бла)

то ордер1=открываем ордер(такой-то лот на покупку, стопа нет, а профит есть)

ордер2=открываем ордер(такой-то лот на покупку, стопа нет, а профит есть)

ордер3=ставим отложенный ордер( такой-то лот на покупку, стопа нет, а профит есть)

ордер4=ставим отложенный ордер( такой-то лот на покупку, стопа нет, а профит есть)

если(пробит какой-то профит из четырех)

закрыть все ордера(и в рынке, и отложенные)

Вот с "если(пробит какой-то профит из четырех), закрыть все ордера(и в рынке, и отложенные) " у меня и возникли проблемы.

Дайте пожалуйста какую-нибудь подсказку, или совет. Очень буду Вам признателен!

 
Если последний закрытый ордер закрылся по тейку (цена закрытия-текпрофит<=2 пипса), то : ваши действия ( закрыть все ордера)
 
Figar0:


"пробитии одного из них Тейк-профит" это круто)

Тут 2 последовательных действа: узнать что ордер закрылся по ТП, и в случае этого закрыть все. В чем конкретно сложность?



Точнее даже так: как все закрыть, мне более-менее понятно. А вот как выразить логически, что какой-то из "профитов" пробит я не могу.))
 
FAQ:
Если последний закрытый ордер закрылся по тейку (цена закрытия-текпрофит<=2 пипса), то : ваши действия ( закрыть все ордера)



У меня ТС основанная на методе Мартингейла, т.е.:

Вошли в рынок открытием лота 0.01 (ордер1) по EUR/USD, допустим, по цене 1.3150 на покупку с тейк-профитом каким-то + ставим три отложенных ордера:

1) покупка по 1.3050, лот 0.02, тейк-профит (ордер2)

2) покупка по 1.2950, лот 0.04, тейк-профит (ордер3)

3) покупка по 1.2850, лот 0.08, тейк-профит (ордер4)

Задача:

Когда какой-нибудь из этих ордеров закроется по тейк-профиту, закрыть все оставшиеся.

 
xgnom:


Точнее даже так: как все закрыть, мне более-менее понятно. А вот как выразить логически, что какой-то из "профитов" пробит я не могу.))
Изучайте функции KimIV, там есть всё, что вам нужно.
if(isCloseLastPosByTake("0", -1, -1)) 
  {
   //закрываем все ордера
  }

Функция isCloseLastPosByTake().

 
khorosh:
Изучайте функции KimIV, там есть всё, что вам нужно.

Функция isCloseLastPosByTake().

Огромное спасибо за совет!
 
khorosh:
Изучайте функции KimIV, там есть всё, что вам нужно.

Функция isCloseLastPosByTake().



Почему-то не получается, написал следующее:

Отдельным скриптом "Pro fit.mq4":

bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
datetime t;
double ocp, otp;
int dg, i, j=-1, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(sy, MODE_DIGITS);
if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
otp=NormalizeDouble(OrderTakeProfit(), dg);
if (ocp==otp) return(True);
}
return(False);
}

В своем советнике пишу в начале:

#include <Profit.mq4>

Далее код из советника:

if(isCloseLastPosByTake(0, -1, -1))
{
int total = OrdersTotal();
for(int i=total-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();

bool result = false;

switch(type)
{
//Close opened long positions
case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;

//Close opened short positions
case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
break;

//Close pending orders
case OP_BUYLIMIT :
case OP_BUYSTOP :
case OP_SELLLIMIT :
case OP_SELLSTOP : result = OrderDelete( OrderTicket() );
}

if(result == false)
{
Alert("Order ", OrderTicket(), " failed to close. Error:", GetLastError() );
Sleep(3000);
}
}

return(0);
}

Далее компилирую, и Метаэдитор предупреждает:"'isCloseLastPosByTake' - expression on global scope not allowed ". В итоге советник в нужный момент не закрывает ордера. Что я делаю не так?

 
Код функции isCloseLastPosByTake нужно поместить в советник, но снаружи функции start(). Что за скрипт Pro fit.mq4 не понял.
 
khorosh:
Код функции isCloseLastPosByTake нужно поместить в советник, но снаружи функции start(). Что за скрипт Pro fit.mq4 не понял.

В Profit.mq4 я поместил код функции isCloseLastPosByTake, а в своем советнике перед функцией start() сделал #include < Profit.mq4 >

Сейчас убрал #include < Profit.mq4 > из советника, и вписал полностью код функции isCloseLastPosByTake - естественно ничего не поменялось, и такое же предупреждение "'isCloseLastPosByTake' - expression on global scope not allowed "

Может быть у меня структура кода неправильная?

код функции isCloseLastPosByTake

старт

если(условие выполняется)

открываем ордер1 на покупку

открываем ордер2 на покупку

ставим отложенный ордер3 на покупку

ставим отложенный ордер4 на покупку

ретурн

если(условие выполняется)

открываем ордер1 на продажу

открываем ордер2 на продажу

ставим отложенный ордер3 на продажу

ставим отложенный ордер4 на продажу

ретурн

если( isCloseLastPosByTake )

закрываем все ордера

ретурн

Причина обращения: