Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Удобнее торговать с помощью смартфона? Мобильная версия MetaTrader 5 тебе подойдет!
evgen117
64
evgen117 2014.04.09 19:48 
Доброго времени суток! Пытаюсь создать эксперта, но застрял... Прошу подсказать, как прописать, чтобы эксперт открывал сделку на уровне, когда цена равна МА
Алексей Тарабанов
7220
Алексей Тарабанов 2014.04.09 19:59  
Такого уровня может не быть, поэтому поищите другую формулировку условия.
Александр
82
Александр 2014.04.09 22:42  

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: камрады, чего код не раскрасился?

Роман
7939
Роман 2014.04.10 00:04  
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 --
Bicus
2395
Bicus 2014.04.10 04:42  

Я бы переписал по-другому 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 (!) пунктов.

Александр
82
Александр 2014.04.10 18:04  
Bicus:

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

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


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

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

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

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

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

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

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

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

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

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