Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 588

 
lil_lil:

Закрываю одновременно 4 позиции, как посчитать их за одну, в функции подсчёта убытков подряд?

Закрыться, из за проскальзывания, могут не по одной цене и время, наверное, разное

Попытка:

Если брокер разрешает встречное закрытие, то для фиксации цены закрытия нужно открыть встречный ордер объемом, равным объему совокупно закрываемых ордеров. После этого цена закрытия получается фиксированной и можно не спеша провести 4 торговых операции встречного закрытия ордеров.

 

Подскажите как определить способ расчета маржи.

У каких то брокеров маржа взимается с каждой позиции. А у каких то, только с разницы в объемах на бай и селл.   (т.е. если на счете полный лок, то маржа ноль)


Как программно определить способ расчета маржи?

 

Здравствуйте. Помогите пожалуйста.

Ищу фрактал выше МА, запоминаю бар, дальше, от этого бара ищу фрактал и если он меньше первого найденного, то true

Постоянно false в коментарии

Comment(f_ma(Symbol(),0,i));
//+----------------------------------------------------------------------------+

bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
 
Ghabo:

Здравствуйте. Помогите пожалуйста.

Ищу фрактал выше МА, запоминаю бар, дальше, от этого бара ищу фрактал и если он меньше первого найденного, то true

Постоянно false в коментарии

Проблема в этой строке

         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}


Если фрактал найден и он выше МА, то надо прервать цикл, а не продолжить его. Ведь после первого найденного будет и другой и третий и так до ...

 
Alexey Viktorov:

Проблема в этой строке


Если фрактал найден и он выше МА, то надо прервать цикл, а не продолжить его. Ведь после первого найденного будет и другой и третий и так до ...

Благодарю. Заменил на break;Теперь постоянно true. но условие if(fr2<fr1) несоблюдено.
 
Ghabo:
Благодарю. Заменил на break;Теперь постоянно true. но условие if(fr2<fr1) несоблюдено.

Значит надо это условие добавить перед выводом результата функции. Что-же в этом сложного???

 
Alexey Viktorov:

Значит надо это условие добавить перед выводом результата функции. Что-же в этом сложного???

Разве не должна функция вернуть false если условие не выполнено?

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
if(rates_total<100) return(0);
int limit=rates_total-prev_calculated;
if(limit>200)limit=200;
   for(int i=limit; i>0; i--)
     {
     
     
     Comment(f_ma(Symbol(),0,i));
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  //-------------------
  bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
  
 
Ghabo:

Разве не должна функция вернуть false если условие не выполнено?

Проверьте что возвращает iFractals ноль или пустое значение.

 
Alexey Viktorov:

Проверьте что возвращает iFractals ноль или пустое значение.

В окне данных пустое значение. Заменил if(f!=0) на if(f!=EMPTY_VALUE), результат без изменений. 
 
Ghabo:
В окне данных пустое значение. Заменил if(f!=0) на if(f!=EMPTY_VALUE), результат без изменений. 

1. Я говорил проверить, а не заменить. iFractals возвращает 0 если нет фрактала. Я этим регулярно не пользуюсь и естественно не забиваю не высохшие остатки памяти такими мелочами.

2. Функция, хоть и написана ужасно, но всё-же работает исправно.

3. В Comment отображается последнее значение. Замените на

     Print("************ ", f_ma(Symbol(), 0, 0));
и посмотрите сколько раз будет напечатано
2018.07.30 21:02:43.656 00 EURUSD.e,H1: ************ true
Причина обращения: