Скачать MetaTrader 5

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

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

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

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

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

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


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

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

Dimon
35
Dimon  
Figar0:


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

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



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

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

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

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

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

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

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

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

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

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

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

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


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

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



Точнее даже так: как все закрыть, мне более-менее понятно. А вот как выразить логически, что какой-то из "профитов" пробит я не могу.))
Dimon
35
Dimon  
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)

Задача:

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

khorosh
9561
khorosh  
xgnom:


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

Функция isCloseLastPosByTake().

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

Функция isCloseLastPosByTake().

Огромное спасибо за совет!
Dimon
35
Dimon  
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 ". В итоге советник в нужный момент не закрывает ордера. Что я делаю не так?

khorosh
9561
khorosh  
Код функции isCloseLastPosByTake нужно поместить в советник, но снаружи функции start(). Что за скрипт Pro fit.mq4 не понял.
Dimon
35
Dimon  
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 )

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

ретурн

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий