Проблемы с входом

 
Доброго времени суток! Пытаюсь создать эксперта, но застрял... Прошу подсказать, как прописать, чтобы эксперт открывал сделку на уровне, когда цена равна МА
 
Такого уровня может не быть, поэтому поищите другую формулировку условия.
 

double MA = iMA(...); // значение МА'шки

double GoodDelta= 0.01; // допустимая погрешность между ценой и МА'шкой;

Lot= 0.1; //лот, которым хотим открыться

int Ticket = 0; // тикет будущего открытого ордера

double SL = 0; // уровень цены Stop Loss (может быть равно 0). значение должно быть нормализовано (т.е чтобы было не больше знаков после запятой, чем Digits)

double TP = 0; // уровень цены Take Profit (может быть равно 0). значение должно быть нормализовано (т.е чтобы было не больше знаков после запятой, чем Digits)

int Slipp = 0; // максимальное проскальзывание цены (в пунктах), 0 = не учитывать

bool NeedToBuy = true; // хотим открыть Buy

bool GoodToBuy = MathAbs(Ask - MA) < GoodDelta; // подходящая ли цена для Buy ?

bool GoodToSell = MathAbs(Bid - MA) < GoodDelta; // подходящая ли цена для Sell ?

bool GoodPrice = (GoodToBuy) || (GoodToSell); // флаг, что будем пытаться открыться (цена подходит или для Buy, или для Sell)

if (NeedToBuy) { if (GoodToBuy) Ticket = OrderSend(Symbol, OP_BUY, Lot, Ask, Slipp, SL, TP);} // еще можно добавить комментарий к ордеру, магик и цвет, см. описание OrderSend()

else { if (GoodToSell) Ticket = OrderSend(Symbol, OP_SELL, Lot, Bid, Slipp, SL, TP);}

if (GoodPrice && Ticket<1) { } // если должны были открыться, но не открылись - получаем код ошибки и разруливаем ситуацию в зависимости от ошибки.


Код схематичный. Уже надо знать куда открываться и проверять не открылись ли уже на предыдущих тиках/барах.

PS: камрады, чего код не раскрасился?

 
EverAlex:


double MA = iMA(...); // значение МА'шки

double GoodDelta= 0.01; // допустимая погрешность между ценой и МА'шкой;

Lot= 0.1; //лот, которым хотим открыться

int Ticket = 0; // тикет будущего открытого ордера

double SL = 0; // уровень цены Stop Loss (может быть равно 0). значение должно быть нормализовано (т.е чтобы было не больше знаков после запятой, чем Digits)

double TP = 0; // уровень цены Take Profit (может быть равно 0). значение должно быть нормализовано (т.е чтобы было не больше знаков после запятой, чем Digits)

int Slipp = 0; // максимальное проскальзывание цены (в пунктах), 0 = не учитывать

bool NeedToBuy = true; // хотим открыть Buy

bool GoodToBuy = MathAbs(Ask - MA) < GoodDelta; // подходящая ли цена для Buy ?

bool GoodToSell = MathAbs(Bid - MA) < GoodDelta; // подходящая ли цена для Sell ?

bool GoodPrice = (GoodToBuy) || (GoodToSell); // флаг, что будем пытаться открыться (цена подходит или для Buy, или для Sell)

if (NeedToBuy) { if (GoodToBuy) Ticket = OrderSend(Symbol, OP_BUY, Lot, Ask, Slipp, SL, TP);} // еще можно добавить комментарий к ордеру, магик и цвет, см. описание OrderSend()

else { if (GoodToSell) Ticket = OrderSend(Symbol, OP_SELL, Lot, Bid, Slipp, SL, TP);}

if (GoodPrice && Ticket<1) { } // если должны были открыться, но не открылись - получаем код ошибки и разруливаем ситуацию в зависимости от ошибки.


Код схематичный. Уже надо знать куда открываться и проверять не открылись ли уже на предыдущих тиках/барах.

PS: камрады, чего код не раскрасился?


В учебнике есть готовый робот - правьте условия и всё. Код надо ставить грамотно. Попробуйте ещё раз... :-)

//--------------------------------------------------------------- 4 --
   // Параметры технич. индикат:
   M_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); // 0 бар
   M_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,1); // 1 бар
   S_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);//0 бар
   S_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);//1 бар
 
   St_M_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN,  0);
   St_M_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN,  1);
   St_S_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);
   St_S_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);
//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)
      return(10);                      // Открытие Buy    
   if(M_0<S_0 &&  M_0>Opn && St_M_0<St_S_0 && St_S_0>St_max)
      return(20);                      // Открытие Sell 
   if(M_0<S_0 &&  M_0>Cls && St_M_0<St_S_0 && St_S_0>St_max)
      return(11);                      // Закрытие Buy    
   if(M_0>S_0 && -M_0>Cls && St_M_0>St_S_0 && St_S_0<St_min)
      return(21);                      // Закрытие Sell         
//--------------------------------------------------------------- 6 --
 

Я бы переписал по-другому 3 строки:

int GoodDelta = 100; // допустимая погрешность между ценой и МА'шкой в пунктах (для пятизнака);
bool GoodToBuy = MathAbs(Ask - MA) < NormalizeDouble (GoodDelta * Point, Digits); // подходящая ли цена для Buy ?
bool GoodToSell = MathAbs(Bid - MA) < NormalizeDouble (GoodDelta * Point, Digits);; // подходящая ли цена для Sell ?

Задавать погрешность в абсолютных единицах - плохое решение.

0.01 (пятизнак) - для йеновых пар - это 10 пунктов, а для, например, eurusd - это уже 1000 (!) пунктов.

 
Bicus:

Задавать погрешность в абсолютных единицах - плохое решение.

0.01 (пятизнак) - для йеновых пар - это 10 пунктов, а для, например, eurusd - это уже 1000 (!) пунктов.


Плохое решение для примера или для готовой ТС ?

Т.е., что погрешность у меня задана жесткая это неправильно, а что все остальные переменные заданы жестко - это нормально ?

Нормально, что именно true задано для NeedToBuy ? Хотя должен быть целый блок кода, который решает куда открываться....

И Lot я в примере фиксированным задал...

И проверять надо, что SL (которые тоже в пункты пересчитать надо бы, как и TP) пытаемся поставить не ближе, чем STOPLEVEL. И проверять хватит ли AccountFreeMargin(), если SL==0.

Но для схемы "как открыться по рынку" - нормуль.

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

Предполагается, что трейдер, открывающий сделку, понимает эти нюансы и сам задаст/расчитает правильную погрешность для его ТС.

А если бы я не присвоил переменным значения, то во что превратился бы OrderSend() из моего примера? В цитирование документации?

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