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

 
Valeriy Yastremskiy:

модуль разницы. Без модуля только верхняя зона попадает в условие. | OpenPrice - Bid |> 10*_Point условие открытия

Так надо по условию, Bid ниже OpenPrice и никаких модулей.

В противном случае получим верный результат если Bid будет выше OpenPrice

 
Valeriy Yastremskiy:

модуль разницы. Без модуля только верхняя зона попадает в условие. | OpenPrice - Bid |> 10*_Point условие открытия

Я не совсем понял...

можно, пожалуйста, доступнее...для новичка)

 
MakarFX:

Ты меня удивляешь


Чем?
 
Alexey Viktorov:
Чем?
Alexey Viktorov:

Из картинки видно, что OpenPrice - Bid не должно быть больше 10*_Point

но может быть меньше, в том числе отрицательным

 
MakarFX:

но может быть меньше, в том числе отрицательным

Ага… и получается условие с «&& > 0»

А вопрос-то к чему? Просто так, или для чего-то?

 
Alexey Viktorov:

Ага… и получается условие с «&& > 0»

А вопрос-то к чему? Просто так, или для чего-то?

Я сейчас использую такое определение момента входа в рынок

if(Bid < OpenPrice && Bid > OpenPrice-Х*Point)
if(Ask > OpenPrice && Ask < OpenPrice+Х*Point)

подумал может есть возможность упростить)

 

помогите оптимизировать кусок кода отвечающего за мартин

задача такая:

-после стопа мартин умножает лот;

-количество умножений можно регулировать функцией OrdersClose, при достижении заданного значения лотность сброшена на стартовую;

- нужно чтобы лотность не сбрасывалась на стартовую, а уменьшалась последовательно в обратном порядке;

например OrdersClose=5, Мартин=2, лот=0.01:

имеем последовательность: 0,01; 0,02; 0,04; 0,08; 0,16 (сброс) 0,01; 0,01;,,,,

нужно : 0,01; 0,02; 0,04; 0,08; 0,16 (сброс) 0,16; 0,08; 0,04;.... 0,01.

у меня знаний не хватает самому решить задачу.

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

double LOT()
{
   int n=0;
   double OL=dLots;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == iMagic)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++;
               if (n>=OrdersClose) {Comment("1");return(dLots);}
            }
            else
            {
               if (n==0) {Comment("2");return(dLots);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}
 
MakarFX:

Я сейчас использую такое определение момента входа в рынок

подумал может есть возможность упростить)

if(Bid < OpenPrice && Bid > OpenPrice-Х*Point)
if(Ask > OpenPrice && Ask < OpenPrice+Х*Point) // цену в середину диапазона ставим

OpenPriceS=OpenPrice-X*Point/2;
if(fabs(Bid-OpenPriceS)>Х*Point){ ....   }

И у Алексея все правильно))

Alexey Viktorov:

Так надо по условию, Bid ниже OpenPrice и никаких модулей.

В противном случае получим верный результат если Bid будет выше OpenPrice

Исправлено)

Да, верно. Условие не поменял. По привычке. На рисунке сбивает что Бид в середине)))

Но там второе условие, запись одинакова по количеству условий.

 
законопослушный гражданин:

помогите оптимизировать кусок кода отвечающего за мартин

задача такая:

-после стопа мартин умножает лот;

-количество умножений можно регулировать функцией OrdersClose, при достижении заданного значения лотность сброшена на стартовую;

- нужно чтобы лотность не сбрасывалась на стартовую, а уменьшалась последовательно в обратном порядке;

например OrdersClose=5, Мартин=2, лот=0.01:

имеем последовательность: 0,01; 0,02; 0,04; 0,08; 0,16 (сброс) 0,01; 0,01;,,,,

нужно : 0,01; 0,02; 0,04; 0,08; 0,16 (сброс) 0,16; 0,08; 0,04;.... 0,01.

у меня знаний не хватает самому решить задачу.

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

//+------------------------------------------------------------------+
//| Расчет лота                                                      |
//+------------------------------------------------------------------+
double Lots()
  {
   double L=0;
   // если последняя закрытая сделка убыточная и лот равен стартовому
   // включаем Мартин
   if(GetInfoLastPos(2)<0&&GetInfoLastPos(1)==Lot) 
     {
      Martin=true;
     }
   // если последняя закрытая сделка убыточная и лот больше или равен максимальному
   // выключаем Мартин
   if(GetInfoLastPos(2)<0&&GetInfoLastPos(1)>=MaxMartinLot)
     {
      Martin=false;
     }
   // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот
   if(Martin==true)
     {
      L=NormalizeDouble(GetInfoLastPos(1)*K_Martin,DigitsLot);
     }
   // если последняя закрытая сделка убыточная и Мартин выключен, делим лот
   if(Martin==false)
     {
      L=NormalizeDouble(GetInfoLastPos(1)/K_Martin,DigitsLot);
     }

   if(L>MAXLOT) L = MAXLOT;
   if(L<MINLOT) L = MINLOT;
   return(L);
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                                    |
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
 
Valeriy Yastremskiy:

И у Алексея все правильно))

Да, верно. Условие не поменял. По привычке. На рисунке сбивает что Бид в середине)))

Спасибо, но это никак не упрощает мой код)

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