0
1.Почему Вы тестируете " пр контрольным точкам" а не «по всем тикам».Там картина совсем другая.
2.Зачем у Вас в советнике функции Лот1 и Лот2 если они не используются.
3.Советник торгует всегда одним лотом указанным в настройках.Так задумано?
Проверьте функции:
<code>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastOrderLot(int type=-1)
{
   datetime time =0;
   double lot=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
           double   lt = OrderLots();
           datetime cl = OrderOpenTime();
            
           if(type==OP_BUY)
             if(cl>time && (OrderType()==OP_BUY))// || OrderType()==OP_BUYSTOP))
               {  
               time = cl; 
               lot  = lt;
               }
           if(type==OP_SELL)
             if(cl>time && (OrderType()==OP_SELL))// || OrderType()==OP_SELLSTOP))
               {
               time = cl; 
               lot  = lt;
               }
           }
   return(NormalizeDouble(lot, 2));
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(int type)
{
  double lot=Lots;
   
   if(CountOrders(OP_SELL)>0 && type==OP_BUY)
      lot=LastOrderLot(OP_SELL)*KLot;
//      lot=Lots*MathPow(KLot,CountTrades())*3/4;
   if(CountOrders(OP_BUY)>0 && type==OP_SELL)
      lot=LastOrderLot(OP_BUY)*KLot;
//      lot=Lots*MathPow(KLot,CountTrades())*3/4;

      lot=NormalizeDouble(lot, 2);
      
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
}
//+------------------------------------------------------------------+
</code>

Что вы хотели получить таким кодом? Скорее всего Вы его откуда то часть скопировали а вторую часть сами дописали.Там и логические и синтаксические ошибки.
4.Судя по данной переписке советник интересует только нас. Предлагаю перенести переписку в приватную плоскость. Используйте в верхнем левом углу функции «создать запись»или функцию «Приват» под этим сообщением.
avatar

ssg

  • 8 апреля 2022, 19:54
0
Вообще конечно нет большого интереса быть «скорой помощью» и отвечать как то в «темную», не зная изначальный алгоритм и конечные цели. Поэтому и код будет может быть не самый оптимальный.
Вариантов ХеджМартинов здесь много. Посмотрите. Рассматривать повторно желания нет. Интересно обсудить новые варианты.Или в публичной плоскости или приватно.
Конечно так же можете писать и здесь. Наверно тоже сможете получить некоторые ответы.
avatar

ssg

  • 8 апреля 2022, 15:23
0
Для начала можете считать лоты отдельно по направления и «выкрутиться» так:
<code>


extern double Lots       = 0.01;     // лот
extern double MaxLot     = 5;        // максимальный торговый объем
extern double KLot       = 0;        // коэфициент увеличение лота
extern double PlusLot    = 0.01;     //прибавлять это значение к лоту последующих ордеров
extern double MinusLot   = 0.00;     //отнимать это значение от лота предыдущего ордера
extern int    DigitsLot  = 2;        //округление значения лота
extern double PLot       = 0.1;      // прибавление лота
extern int    Magic      = 123;      // магик
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double lotb()
  {
   double lotb=Lots;
   if(CountTrades(OP_BUY)>0)
   {
   if(!KLot==0 && PlusLot==0 && MinusLot==0){ lotb=NormalizeDouble(Lots*MathPow(KLot,CountTrades(OP_BUY)),DigitsLot);}
   if(!KLot==0 && !PlusLot==0 && MinusLot==0){lotb=NormalizeDouble(Lots+PlusLot*CountTrades(OP_BUY),DigitsLot);}  
   if(!KLot==0 && PlusLot==0 && !MinusLot==0){lotb=NormalizeDouble(Lots-MinusLot*CountTrades(OP_BUY),DigitsLot);}   
   if(!KLot==0 && !PlusLot==0 && !MinusLot==0){lotb=NormalizeDouble(Lots,DigitsLot);}
   } 
   if(lotb>MaxLot)lotb=Lots;
   return(lotb);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double lots()
  {
   double lots=Lots;
   if(CountTrades(OP_SELL)>0)
   {
   if(!KLot==0 && PlusLot==0 && MinusLot==0){ lots=NormalizeDouble(Lots*MathPow(KLot,CountTrades(OP_SELL)),DigitsLot);}
   if(!KLot==0 && !PlusLot==0 && MinusLot==0){lots=NormalizeDouble(Lots+PlusLot*CountTrades(OP_SELL),DigitsLot);}  
   if(!KLot==0 && PlusLot==0 && !MinusLot==0){lots=NormalizeDouble(Lots-MinusLot*CountTrades(OP_SELL),DigitsLot);}   
   if(!KLot==0 && !PlusLot==0 && !MinusLot==0){lots=NormalizeDouble(Lots,DigitsLot);}
   } 
   if(lots>MaxLot)lots=Lots;
   return(lots);
  }  
//+------------------------------------------------------------------+</code>

avatar

ssg

  • 8 апреля 2022, 15:13
0
Кроме публичного общения возможно и приватное общение.

extern double         Profit         = 5;        // профит в валюте
extern double         Lots           = 3.1;      // лот

При таких параметрах не мудрено получить прибыль. Вы готовы торговать таким лотом на реальном счете?

avatar

ssg

  • 8 апреля 2022, 14:59
0
Добрый день.
1.Если Вы имеете в виду имею я ли образование как программист — нет.
2.Смогу ли я запрограммировать Вашу стратегию или часть её — не знаю, т.к. для меня Вы её не озвучили.
3.Попросить написать советник на этом сайте Вы можете или имея уровень 3 или при наличии поручителя с уровнем не ниже 3. Но имейте в виду заказать написание советника можно один раз в месяц.Поэтому поручитель будет только тогда когда стратегия покажется интересной для поручителя. Правда если удивите Андрея стратегией, возможно он напишет в виде исключения сразу.
4.На этом сайте Андрей пишет, в основном, советники только для проверки идеи.
Если идея и стратегия верна, тогда можно уже писать советник для торговли на реальном счёте.
5.О каком вопросе Вы говорите? Мой вопрос о стратегии вызван фразой:
Мало того, что с формулой лажа, так все время забываю, что работа идет отложками. Короче, шерстить весь алгоритм надо. Позже. Покимарить надо мальца.
avatar

ssg

  • 8 апреля 2022, 14:41
0
Поправил функцию, теперь ордера и стопы выставляются:


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type, double price=0)
  {
   int r=0;
   color clr=clrNONE;
   double lot=0,SL=0;
   double sl = OrderSL*Point;
//   double sl = Delta*4*KLot*Point;

   if(type==OP_SELLSTOP)
     {
     clr=clrRed;
   //  lot=Lot(OP_SELL);
     SL=NormalizeDouble(price+sl,Digits);
     }
   if(type==OP_BUYSTOP)
     {
     clr=clrBlue;
  //   lot=Lot(OP_SELL);
     SL=NormalizeDouble(price-sl,Digits);
     }

   r=OrderSend(Symbol(),type,Lot(type),NormalizeDouble(price,Digits),Slip,SL,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+

 

К стати, каким вариантом советника получили представленную кривую тестера.
avatar

ssg

  • 8 апреля 2022, 13:11
0
Вы определились со стратегией и алгоритмом?
avatar

ssg

  • 8 апреля 2022, 11:50
0
Немного изменил код. Уже, до кучи, проверьте этот вариант:


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeOOP()
  {
   bool m=1;
   double delta=0,oop=0,sl=0,tp=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUYSTOP)
              {
               delta=NormalizeDouble(OrderOpenPrice()-Bid,_Digits);

               if(delta>(Step + Delta)*_Point)
                 {
                  oop=NormalizeDouble(Bid+Delta*_Point,_Digits);
                  sl=NormalizeDouble(oop-StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(oop+TakeProfit*_Point,_Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Blue);
                  return;
                 }
              }

            if(OrderType()==OP_SELLSTOP)
              {
               delta=NormalizeDouble(Bid-OrderOpenPrice(),_Digits);

               if(delta>(Step + Delta)*_Point)
                 {
                  oop=NormalizeDouble(Bid-Delta*_Point,_Digits);
                  sl=NormalizeDouble(oop+StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(oop-TakeProfit*_Point,_Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Red);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
avatar

ssg

  • 8 апреля 2022, 09:01
0
Настройки менять не пробовали?:) 
avatar

ssg

  • 8 апреля 2022, 05:57
0
У автора так и есть:

 PutLabel("Profit","Profit: "+string(NormalizeDouble(AllProfit(),2))+" USD",170,70,Aqua);
avatar

ssg

  • 8 апреля 2022, 04:55
0
Текста было много.Читать все с начала нет желания.Давайте начнем с начала и по порядку, по одной задаче.
1.Что Вы хотите от функции Лот2 и что не получается? Желательно еще и в примерах (цифрах), так будет понятнее.
avatar

ssg

  • 7 апреля 2022, 14:32
0
В функции Лот2.
avatar

ssg

  • 7 апреля 2022, 14:17
0
На вскидку сразу:
1.
return(NormalizeDouble(lot, 2));   // В 2 разза можно заменить на KLot. Тоже интересно получится, если потестить.

Видно что Вы не разобрались пока с самыми азами языка (хотя научились копировать участки кодов из советника в советник.)
extern double KLot = 2.5; // увеличение лота в раз
return(NormalizeDouble(lot, 2)); здесь 2-это кол-во знаков после запятой.
Лот обычно не может быть меньше чем 0.01.
В других случаях это может быть и 0 и 10, в зависимости от задачи.
avatar

ssg

  • 7 апреля 2022, 13:13
0
Вставьте код за несколько раз. По две -четыре функции за один раз. Только не разрывайте тело функции. Чтобы не было так: начало функции в одной части, а окончание в другой части. Смотрите как у меня.
avatar

ssg

  • 7 апреля 2022, 13:02
0
Согласитесь так читать код удобнее. Функция ОнТик этого советника:



//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double atr=iATR(NULL,0,ATR,0);

   if(AllProfit()>Profit || AllProfit()<-Loss)
     {
      CloseAll();
      DelOrder();
     }

   if(CountTrades()<1 && atr>Level)
     {
      if(CountOrders(4)<1)
        {
         PutOrder(4,Bid+Delta*_Point);
         b=NormalizeDouble(Bid+Delta*_Point,_Digits);
        }

      if(CountOrders(5)<1)
        {
         PutOrder(5,Bid-Delta*_Point);
         s=NormalizeDouble(Bid-Delta*_Point,_Digits);
        }
     }

// открытие последующих ордеров
   if(num!=CountTrades())
     {
      if(LastOrderType()==1)
        {
         DelOrder();
         if(CountOrders(5)<1)
            PutOrder(5,s);
        }

      if(LastOrderType()==2)
        {
         DelOrder();
         if(CountOrders(4)<1)
            PutOrder(4,b);
        }
      num=CountTrades();
     }


   Comment("\n Profit: ",DoubleToString(AllProfit(),2),
           "\n Last Order Type: ",LastOrderType(),
           "\n Count Trades: ",CountTrades());
  }
//+------------------------------------------------------------------+
avatar

ssg

  • 7 апреля 2022, 10:07
0
Как то Вы не верно скопировали.Все строки выравнялись по левому краю.Режет глаза и трудно воспринимается.
Что Вы хотели вычислять в функции Лот2. Опишите своими словами и скопируйте только эту функцию.
avatar

ssg

  • 7 апреля 2022, 10:03
0
Попробуйте так:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeOOP()
  {
   bool m=1;
   double delta=0,oop=0,sl=0,tp=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUYSTOP)
              {
               delta=NormalizeDouble(OrderOpenPrice()-Bid,_Digits);

               if(delta>(Step + Delta)*_Point)
                 {
                  oop=NormalizeDouble(Bid+Step*_Point,_Digits);
                  sl=NormalizeDouble(oop-StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(oop+TakeProfit*_Point,_Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Blue);
                  return;
                 }
              }

            if(OrderType()==OP_SELLSTOP)
              {
               delta=NormalizeDouble(Bid-OrderOpenPrice(),_Digits);

               if(delta>(Step + Delta)*_Point)
                 {
                  oop=NormalizeDouble(Bid-Step*_Point,_Digits);
                  sl=NormalizeDouble(oop+StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(oop-TakeProfit*_Point,_Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Red);
                  return;
                 }
              }
           }
        }
     }
  }
avatar

ssg

  • 7 апреля 2022, 08:28
0
<соdе> сюда копируете код </соdе>
На дефолтный советник дайте просто ссылку.
avatar

ssg

  • 7 апреля 2022, 04:16