Jump to content

Что неправильно?


Recommended Posts

Hasan

Подскажите, почему ордер закрывается только по Стоп Лосс или Профит и не закрывается по сигналу?

Может, что нибудь еще не правильно?

Код очень простой.

 

 

 

 

extern int Magic=12345; // Магический номер

extern int StopLoss=150; // Стоплосс, 0 - не используется

extern int TakeProfit=200; // Тейкпрофит , 0 - не используется

extern int Slippage=0; // Проскальзывание

extern double Lots=0.1; // Фиксированный лот

 

 

//--- input parameters

extern double SMA8=8.0;

extern double SMA11=11.0;

extern double SMA13=13.0;

extern double SMA21=21.0;

 

 

int IndicatorSignal()

{

int Sig=0;

 

 

 

double SMA8 = iMA(NULL,PERIOD_M30,8,0,MODE_EMA,PRICE_CLOSE,1);

double SMA11 = iMA(NULL,PERIOD_M30,11,0,MODE_EMA,PRICE_CLOSE,1);

double SMA13 = iMA(NULL,PERIOD_M30,13,0,MODE_SMA,PRICE_CLOSE,1);

double SMA21 = iMA(NULL,PERIOD_M30,21,0,MODE_EMA,PRICE_CLOSE,1);

 

 

//Указываем Сигналы:

 

if(Ask<SMA8<=SMA11<SMA13<SMA21)Sig=2; // Если выполняется - открываемся в селл

 

if(Ask>SMA21)Sig=1; // Если выполняется - закрываем сделку

 

 

// 1 - закрытие ордера 2 - селл

return(Sig);

}

 

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

 

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

 

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

 

int Signal; // Сигнал к открытию

 

 

//----

 

if(OrdersTotal()>1){return(0);} // открывается только один ордер?

 

Signal=IndicatorSignal();

 

 

//+------------------------------------------------------------------+

// Если сигнал на селл:

//+------------------------------------------------------------------+

if(Signal==2)// селл

{

 

//+------------------------------------------------------------------+

//Открываем позицию

//+------------------------------------------------------------------+

 

OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Ask+125*Point,Bid-200*Point,NULL,12345,0,Red);

}

 

if(Signal==1)// закрываем сделку

{

//+------------------------------------------------------------------+

//Закрываем позицию

//+------------------------------------------------------------------+

OrderClose(12345,0.1,Ask,0,Green);

}

 

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

Link to post
Share on other sites
Circle

Вы задаете не верные параметры для функции OrderClose().

Почитайте справку по этой функции.

Там где у вас стоит 12345 должен быть указан тикет ордера, и ордер должен быть предварительно выбран функцией OrderSelect().


Что такое форекс? Это там где деньги лежат. 

Link to post
Share on other sites
Hasan

Спасибо!

Link to post
Share on other sites
Hasan

Только не хрена не получается!

 

if(Signal==1)// закрываем сделку

 

//+------------------------------------------------------------------+

//Закрываем позицию

//+------------------------------------------------------------------+

 

{

OrderSelect(12345,SELECT_BY_TICKET,MODE_TRADES);

 

{

if(OrderSymbol()=="USDCHF")

 

{

if(OrderType()==OP_SELL)

{

 

if(OrderMagicNumber()==12345)

 

{

if(OrderClose(12345,0.1,Ask,0,Green);

 

}

}

}

}

}

 

 

(12345 - Магический номер?)

Link to post
Share on other sites
AntFX

OrderSelect(12345,SELECT_BY_TICKET,MODE_TRADES);

 

if(OrderClose(12345,0.1,Ask,0,Green);

 

что, опять?

 

Разница между тикетом ордера и его мэджик номером: тикет - это номер ордера у брокера. Мэджик - это номер, который вы сами присваиваете ордеру, чтобы отличать свои ордера от других ордеров.

 

Я бы советовал почитать про торговые операции: http://book.mql4.com/ru/trading/index

Edited by AntFX

1

Link to post
Share on other sites
Hasan

Да я прочитал!! И не один раз! Туповат, староват, а интересно!

Link to post
Share on other sites
Hasan

В учебнике написано:

 

"Если в программе имеются сведения о типе ордера, который необходимо закрыть, о его уникальном номере, а также известно количество лотов, предназначенных для закрытия, то закрыть рыночный ордер очень просто. Для этого в коде программы необходимо использовать обращение к функции OrderClose() с заданными параметрами. Например, если уникальный номер ордера Buy 12345 и необходимо закрыть 0.5 лотов, то обращение к функции закрытия ордера может выглядеть так:

 

OrderClose( 12345, 0.5, Bid, 2 );"

Link to post
Share on other sites
Circle
В учебнике написано:

 

"Если в программе имеются сведения о типе ордера, который необходимо закрыть, о его уникальном номере, а также известно количество лотов, предназначенных для закрытия, то закрыть рыночный ордер очень просто. Для этого в коде программы необходимо использовать обращение к функции OrderClose() с заданными параметрами. Например, если уникальный номер ордера Buy 12345 и необходимо закрыть 0.5 лотов, то обращение к функции закрытия ордера может выглядеть так:

 

OrderClose( 12345, 0.5, Bid, 2 );"

 

В вашем коде "12345" есть не уникальный номер ордера а его магический номер который вы сами ему присвоили.

А уникальным номером ордера будет тот что присвоил ему сервер.

Уникальный номер ордера возвращает функция OrderTicket(), перед этим ордер должен быть выбран функцией OrderSelect().


Что такое форекс? Это там где деньги лежат. 

Link to post
Share on other sites
Hasan

Не понимаю!!!

Не понимаю как указать тикет или порядковый номер ордера, который был открыт советником по сигналу if(Signal==2)// открываем ордер

 

if(Signal==1)// закрываем сделку

 

 

OrderSelect(0, SELECT_BY_POS, MODE_TRADES) {

if (OrderSymbol()=="USDCHF") {

if (OrderType()==OP_SELL) {

if (OrderMagicNumber()==12345) {

if ( OrderClose(23456,0.1,Point,0,Green);

 

}

}

}

}

 

//----

return(0);

}

 

 

 

При компиляции выдает : '\end_of_program' - unbalanced left parenthesis

Link to post
Share on other sites
Hasan

В таком варианте при компиляции опять сигнал:

'\end_of_program' - unbalanced left parenthesis

 

 

 

 

if(Signal==1)// закрываем сделку

 

for (int i=0; i<OrdersTotal(); i++)

{

OrderSelect( i, SELECT_BY_POS, MODE_TRADES) {

if (OrderMagicNumber()==12345) {

if ( OrderClose(23456,0.1,Point,0,Green);

 

}

}

}

 

 

 

 

 

//----

return(0);

}

Link to post
Share on other sites
AntFX

Ваш кусок кода правильнее написать так

 

if(Signal==1)// закрываем сделку

{

for (int i=0; i

{

if(OrderSelect(i' date=' SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderType()

{

if (OrderMagicNumber()==12345)

{

[b'] OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100); [/b]

}

}

}

}

 

return(0);

}

Edited by AntFX

1

Link to post
Share on other sites
AntFX

Вообще, попытайтесь понять, что означает каждая строчка, каждая функция, каждый параметр, вплоть до каждой скобки. Если не получается понять, задавайте вопросы на форуме. Не копируйте примеры из учебника, пытаясь их изменить "на свой вкус" и удивляясь потом, почему они не работают.


1

Link to post
Share on other sites
Pavel Kononenko

ТС, ну хватит быдлокодить... Вам же говорят, что нужно тикет передавать первым параметром. Откройте книжку, что скинули выше.

for (int pos=0; pos<OrdersTotal(); pos++){
 if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)  && Signal==1){
   if (OrderMagicNumber()==12345){
     if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,30,Red);
     if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);
   }
 }
}

И оформляйте код в тег PHP.

А еще в вашем коде напрочь отсутствует логика работы и не понятно, что вы хотите этим кодом сказать.

Edited by Rails
Link to post
Share on other sites
Hasan
Вообще, попытайтесь понять, что означает каждая строчка, каждая функция, каждый параметр, вплоть до каждой скобки. Если не получается понять, задавайте вопросы на форуме. Не копируйте примеры из учебника, пытаясь их изменить "на свой вкус" и удивляясь потом, почему они не работают.

 

Спасибо! Компиляция прошла успешно.

Теперь пытаюсь понять почему ордер не закрывается.

Учебник начал читать по второму кругу с карандашом.

Сложновато, давно не учился, лет тридцать примерно.

Link to post
Share on other sites
Hasan
ТС, ну хватит быдлокодить... Вам же говорят, что нужно тикет передавать первым параметром. Откройте книжку, что скинули выше.

for (int pos=0; pos<OrdersTotal(); pos++){
 if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)  && Signal==1){
   if (OrderMagicNumber()==12345){
     if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,30,Red);
     if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);
   }
 }
}

И оформляйте код в тег PHP.

А еще в вашем коде напрочь отсутствует логика работы и не понятно, что вы хотите этим кодом сказать.

 

Спасибо, Павел!

Компиляция прошла успешно. Ордер не закрывается.

Образования не хватает, но учусь. А советник бросился писать - нетерпение. Хочется все быстро, ждать и тянуть времени нет.

А логика простая - одно пересечение разных МА - открыл на Селл, обратное пересечение - закрыл ордер.

Все очень просто.

Еще раз спасибо!

Link to post
Share on other sites
  • 3 months later...
mkl4ty
Ваш кусок кода правильнее написать так

 

if(Signal==1)// закрываем сделку

{

for (int i=0; i<OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderType()<2)

{

if (OrderMagicNumber()==12345)

{

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100);

}

}

}

}

 

return(0);

}

 

При закрытии позиций и/или удалении отложенных ордеров цикл нужно запускать в обратную сторону, т.е. for (int i=OrdersTotal()-1; i>=0; i--). Иначе при количестве ордеров больше 1 сделки будут закрываться через одну.

Link to post
Share on other sites
  • Capman locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...