Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1063

 
mould:
а как включить этот режим?

Галочку надо отметить в окне тестера, слева внизу:

 

 

Здравствуйте уважаемые гуру.

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

Цель: ввести изменяемый размер лота в зависимости от удаленности от MA.

Во входных параметрах:

extern double Lot1          = 0.01;     // первый вариант лота
extern double Lot2          = 0.03;     // второй вариант лота
extern int    Distan        = 20;       // дистанция от SlowМА

В теле эксперта определили Ма:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Дальше нужно условие: если настоящая цена (Bid или Ask в зависимости от направления) находится до размера Distant, то используем первый размер лота, если больше, то второй.

Первое, что пришло на ум:    

   if (Ask-SlowMA<Distan) Lot == Lot1;
   if (SlowMA-Bid<Distan) Lot == Lot1;
   if (Ask-SlowMA>Distan) Lot == Lot2;
   if (SlowMA-Bid>Distan) Lot == Lot2;
  

Но не работает. Ошибка или в связках с Lot, или  в общей логике.

Заранее спасибо. 

 
delf699:

Здравствуйте уважаемые гуру.

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

Цель: ввести изменяемый размер лота в зависимости от удаленности от MA.

Во входных параметрах:

extern double Lot1          = 0.01;     // первый вариант лота
extern double Lot2          = 0.03;     // второй вариант лота
extern int    Distan        = 20;       // дистанция от SlowМА

В теле эксперта определили Ма:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Дальше нужно условие: если настоящая цена (Bid или Ask в зависимости от направления) находится до размера Distant, то используем первый размер лота, если больше, то второй.

Первое, что пришло на ум:    

   if (Ask-SlowMA<Distan) Lot == Lot1;
   if (SlowMA-Bid<Distan) Lot == Lot1;
   if (Ask-SlowMA>Distan) Lot == Lot2;
   if (SlowMA-Bid>Distan) Lot == Lot2;
  

Но не работает. Ошибка или в связках с Lot, или  в общей логике.

Заранее спасибо. 

А какое значение имеет Ask, Bid и SlowMA, когда сможет Ask-SlowMA быть больше Distan???
 

 

Bid и Ask это последние известные цены покупки и продажи, т. е. текущая цена. 

  SlowMA - моя переименованная Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

Отклонение  текущей цены ( Bid или Ask) от машки (SlowMA) может быть больше или меньше чем Distans. В соответствии с этим надо выставить либо первый либо второй размер лота.  

Находил варианты изменения лота от депозита или количества открытых ордеров, а вот от такого линейного показателя, что то никак.

Что то мне подсказывает, что нужна еще функция, которая возвращает абсолютное значение.   Т.е  применив в  ее к отрицательному числу, в результате получаем положительное число.

 
delf699:

 

Bid и Ask это последние известные цены покупки и продажи, т. е. текущая цена. 

  SlowMA - моя переименованная Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

Отклонение  текущей цены ( Bid или Ask) от машки (SlowMA) может быть больше или меньше чем Distans. В соответствии с этим надо выставить либо первый либо второй размер лота.  

Находил варианты изменения лота от депозита или количества открытых ордеров, а вот от такого линейного показателя, что то никак.

Что то мне подсказывает, что нужна еще функция, которая возвращает абсолютное значение.   Т.е  применив в  ее к отрицательному числу, в результате получаем положительное число.


Абсолютная величина разницы значений Bid и МА может понадобиться чуть позже, а сейчас, раз уж ты не понял намёка, считаем вместе

Bid = 1.12730;

MA = 1.12530;

Distans = 20;

Вопрос:

Когда и будет-ли вообще 1.1273 - 1.1253 больше 20???

Почему-то мой калькулятор показывает 0.002 всего. Но это очень далеко до 20...

 

Спасибо, понял. А можно так:

 dist=Distan*Point;  

   if (Ask-SlowMA<dist) Lot == Lot1;
   if (SlowMA-Bid<dist) Lot == Lot1;
   if (Ask-SlowMA>dist) Lot == Lot2;
   if (SlowMA-Bid>dist) Lot == Lot2;

И как все таки это реализовать правильно ?   

 
delf699:

Спасибо, понял. А можно так:

 dist=Distan*Point;  

   if (Ask-SlowMA<dist) Lot == Lot1;
   if (SlowMA-Bid<dist) Lot == Lot1;
   if (Ask-SlowMA>dist) Lot == Lot2;
   if (SlowMA-Bid>dist) Lot == Lot2;

И как все таки это реализовать правильно ?   

А вот теперь можно применить MathAbs() чтобы не заморачивать голову лишним отслеживанием что из чего вычитать. И ещё один интересный условный оператор

Lot = MathAbs(Ask-SlowMA) < dist ? Lot1 : Lot2;


Что означает: переменной Lot будет присвоено значение переменной Lot1 в случае если Ask- SlowMA будет меньше dist, иначе будет присвоено значение Lot2.

И ещё одна рекомендация: Забудь переменную Point. Используй _Point или функцию Point()

 
Спасибо, красивое решение.
 
Камрады, глаза уже сломал, не могу найти где скобки не хватает, выдает ошибки типа '(' - unbalanced left parenthesis test.mq4 31 8  (начиная со строки где вызов TrendDetection())

Прошу помощи, пока только учусь... 


#define BULL 1;
#define BEAR 2;

//--------------------------------------------------------------------
extern int    SL         = 200;
extern int    TP         = 200;
extern double Lots       = 0.01;
extern double SarStep    = 0.02;
extern double SarMaximum = 0.2;
extern int slippage      = 5;
extern int Magic         = 1;
extern int MaxOrder      = 1;
string OrderComments = "Торгаш 1.0";
int Cnt=0;
datetime PreviousBar;

int start()
{
Cnt=OrdersTotal();
 {
  if (Cnt<MaxOrder)
   {
   if(NewBar() == true)
     {
     if(TrendDetection() == BULL){
     OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slippage,NormalizeDouble(Ask,Digits)-(SL*Point),NormalizeDouble(Ask,Digits)+(TP*Point),OrderComments,Magic,0,CLR_NONE);}
    
     if(TrendDetection() == BEAR){
     OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slippage,NormalizeDouble(Bid,Digits)+(SL*Point),NormalizeDouble(Bid,Digits)-(TP*Point),OrderComments,Magic,0,CLR_NONE);}
     }
   }
else
{return(0);}
 }
return(0);
}

int TrendDetection()
{
  double Sar = iSAR(NULL,0,SarStep,SarMaximum,1);
   if(Close[1] > Sar) {return(BULL);}
   if(Close[1] < Sar) {return(BEAR);}
  return(0);}
  
bool NewBar()
{
 if(PreviousBar<Time[0])
  {
   PreviousBar = Time[0];
   return(true);
  }
  else 
  {
   return(false);
  }
 return(false);
}
 
AlexeyVik:

А вот теперь можно применить MathAbs() чтобы не заморачивать голову лишним отслеживанием что из чего вычитать. И ещё один интересный условный оператор


Что означает: переменной Lot будет присвоено значение переменной Lot1 в случае если Ask- SlowMA будет меньше dist, иначе будет присвоено значение Lot2.

И ещё одна рекомендация: Забудь переменную Point. Используй _Point или функцию Point()

А что там с Point, вроде всё работает?
Причина обращения: