Кому интересно.

Хотелось бы узнать: на блоге кто-то бывает? Как узнать есть ли у кого-то интерес к нему. Кто и когда бывает и бывает ли?
Посмотрел тут советники АМ2. Идеи не доработаны. Некоторые вообще не пошли. Я тут кое чего доработал под себя, с целью улучшить алгоритм. Мог бы выложить. А это кому-то нужно? Понятно, что советники чисто тестовые, для проверки «идеи». Но с ними (идеями) как-то грусновато. Начал изучать кодинг, для того, чтобы воплотить свои идеи. Пока ошибки одолевают, а опыта и знаний, как у второгодника в 4-ом классе. С гулькин… Как это? Маловато будет. Сюда пришел за помощью.
Пока могу подкинуть доработки и изменения по некоторым советникам АМ2, в надежде на его «Ф». Напишите, если кого-то интересует.
А идей, вообще-то, хватает. Самая глупая (?) из них: торгуйте против индикаторов с учетом ММ и будет вам счастье. Помните, индикатор это мотиватор поведения. Сделку откроешь здесь по индюку, стопы поставишь вот сюда Они то нам и нужны. Не ну ты что? Тебя же «идиёта» учили, что без стопов торговать категорически…
  • +9
  • Просмотров: 16999
  • 6 апреля 2022, 00:39
  • kvashnin007
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Следующая запись в моем блоге  
Вы пробовали написать советник сами?
14 апреля 2022

Брокер для ваших роботов, 15 лет на рынке

Комментарии (82)

+
0
К выше изложенному сразу идея для сова. Индикатор, например, RSI показал перепроданность. Наш советник (опыт) или еще кто-то там решил открыть BUY по фэншую и выставить тоже по нему (фэншую) SL. А наш советник выставит на место предполагаемого SL отложку OP_BUYLIMIT. Акулы пришли за стопами, а мы им на хвост сели, с самого начала тренда и потихонечку пирамидимся с тралом. Если идея кого-то вдохновляет, могу составить подробное ТЗ.
Редактирован: 20 марта 2023, 14:16
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 6 апреля 2022, 01:07
+
0
Что по существу можете сказать (без демагогии)?
avatar

  16  ssg Сообщений: 817

  • 6 апреля 2022, 12:23
+
0
Не скучайте. Это по существу. А без демагогии это на базаре. Сказал три рубля и без всякой там демагогии.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 6 августа 2022, 23:51
+
0
Здравствуйте. Это не то, что Вы… Это тест.
Я тоже рад новому общению. А вообще было конкретно сказано или спрошено: интересуют ли кого-то некоторые доработки советников АМ2.Если нет, то вопрос №2: Остались ли здесь спецы, которые готовы на безвозмездной основе помочь правильно написать код советника? Упор на слово ПОМОЧЬ. Хотя по себе знаю как тяжко в чужом коде разбираться бывает. Могу дать обширное ТЗ с картинками для понимания. Правда еще не знаю, начать попроще, чтоб шанс был, или сразу…
С уважением из Одессы.
Р.С. Это не демагогия. Мы тут на ней разговариваем.
Редактирован: 6 апреля 2022, 13:02
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 6 апреля 2022, 13:00
+
0
Попробуйте начать сами с начала. Задачи можно решать поэтапно, небольшими шагами. Будет возможность Вам здесь помогут. Не стоит замахиваться сразу по максимуму. Для начала нужно проверить саму стратегию, а за тем уже доводить код до ума.
С уважением.
P.S. Что касается доработок, можете выкладывать в своем блоге, желательно с описанием доработок и их необходимости. Наверное кто то воспользуется Вашими доработками.
avatar

  16  ssg Сообщений: 817

  • 6 апреля 2022, 13:48
+
0
Уважаемый SSG. Я сюда пришел учиться. На чужих примерах, то оно лучше, чем на пальцах. Я здесь новенький, хоть и зарегился лет 10 назад. Потерялся. Так что, пожалуйста, возьмите временное шефство над несмышленышем. В смысле иногда подсказывайте куда нос совать, а куда не стоит.
Беру чужие совы, изучаю. Если интересно, ищу слабые места и пытаюсь изменить.
Так потихонечку и обучаюсь.
Вот давиче Вы заказывали (если не ошибаюсь) советник HedgeMartinStop.
Изучил. Он сделан по стратегии защиты ценового канала. Правда, для упрощения расчетов, на отложках. С точки зрения математики советник с нулевым риском. Ну если, конечно, дедушка банкир. Сильно жрет ресурсы.
Здесь подгонешь, а сдвинешь время и… ку-ку. Дэпо маловато. Трамвай не въехал.
Смотрите, сразу, с наскока снизил нагрузку на свободные средства на четверть. Советник при очередном подходе открывает ордер лотом в 2 раза больше предыдущего. Если лот увеличивать таким образом, что бы открываемый лот создавал «перевес» лотов на этом уровне ровно в 2 раза больше, чем на противоположном. В результате: защита канала остается, лотность уменьшается, доходность (ну у меня в грубом тесте так) увеличивается.
Если бы я кодировал, как разговариваю, пил бы молоко вместо кофе. Переписал функцию расчета лота. Все по фэншую. А не работает. Тикеты не правильные. А советник вообще по ним нигде и никогда. Короче, функцию забанил. Она в конце сова осталась. Может кто глянет, где я пЛОХ. Пока просто изменил старую авторскую на 25% (автор, если догонит, фаберже оторвет). Сов работает, но не по фэншую. Надо спецу подсунуть. Дальше, по логике вещей, когда цена отходит от канала на расстояние его ширины, мы попадаем в безубыток. Где-то здесь надо обрубать хв… убыточные ордера против хода. Попробовал выставлять SL чуть больше 2-х ширин канала, так сов у меня (да кто бы сомневался) оттказался вообще ордера открывать. Попробую, чуть попозже ставить стопы на открытые ордера. А пока выложу измененный код.
Редактирован: 8 апреля 2022, 18:51
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 6 апреля 2022, 19:15
+
0
Советник HedgeMartinStop с сайта. Изменен порядок расчета цены, снижена нагрузка, увеличена доходность. Советник можно тестировать. Но в нем есть баги. Со стопом, думаю, разберусь сам. А с функцией расчета лота попрошу кого-нибудь из спецов разобраться. Не могу найти ошибку. Функция Lot2() в конце кода.


Редактирован: 8 апреля 2022, 18:52
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 11:46
комментарий был удален 2022-04-07 11:44:52 kvashnin007

комментарий был удален 2022-04-07 11:46:42 kvashnin007

комментарий был удален 2022-04-08 18:53:02 kvashnin007

+
0
Определение переменных за 3-и месяца


Редактирован: 7 апреля 2022, 09:58
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 09:56
комментарий был удален 2022-04-08 18:53:43 kvashnin007

+
0
За год на дневном ТФ с 1.000 сделал 33.800 при просадке 12%. Тестировать на более высоком качестве я не могу.
Если кто-то сможет, поделитесь, пожалуйста, итогами.


Редактирован: 7 апреля 2022, 10:06
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 09:54
+
0
1.Пишите пожалуйста абзацами. Так легче воспринимается текст.
2.Не надо делать много отступлений (лирики, тем более принижаться).
3.Старайтесь писать короткими предложениями. Строго по сути.
4.Не надо разбирать все проблемы сразу. Начните с какой то одной и так шаг за
шагом.
5.Когда будете писать сообщение то обратите внимание: над окном есть слово «code» вот с помощью этой опции можно вставить код. Если не помещается весь
сразу разбейте на части, только не делите функции на части.
6.Дайте ссылку на оригинал советника.Кодов много все по названиям не упомнишь.
avatar

  16  ssg Сообщений: 817

  • 6 апреля 2022, 19:56
комментарий был удален 2022-04-08 18:54:46 kvashnin007

+
0
Да я понимаю, что это даже не на каждом тике, но поразмыслить есть над чем. Ну тем, кто пошире в плечах. Ноут у меня — пятилетний уСкоглазик неизвестного имени. При тесте по КТ успеваю на базар сходить. При прогоне по тикам выдает в журнал много красноты. Дефолтный советник тоже не отстает. По-видимому не умею работать с тестером.
Редактирован: 7 апреля 2022, 20:00
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 6 апреля 2022, 22:38
+
0
<соdе> сюда копируете код </соdе>
На дефолтный советник дайте просто ссылку.
Редактирован: 7 апреля 2022, 05:07
avatar

  16  ssg Сообщений: 817

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

  16  ssg Сообщений: 817

  • 7 апреля 2022, 10:03
+
0
Не обратил внимания на качество. Спасибо. Увидел простынь и обрадЫвался.
Инсульт по глазам долбанул, появились проблемы.
Видел у кого-то код выдан в коротком окне со скролом. А как?.. Правда я быстро осваиваюсь.
Сейчас прокомментирую подробнее функцию и выложу.
Спасибо за участие.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 10:15
+
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

  16  ssg Сообщений: 817

  • 7 апреля 2022, 10:07
+
0
А как Вы это сотворили?

Я пытаюсь вставить код между кодовыми отметками, а сайт мне говорит, что не более 3000 знаков. Что не так?
Редактирован: 7 апреля 2022, 12:03
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 10:42
+
0
Разобрался. Даю функцию. Для сторонних — она не работает.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 10:50
+
0
//+------------------------------------------------------------------+
//|      Замена  функции double Lot(int type)                        |
//+------------------------------------------------------------------+
double Lot2(int type)
{
   double lot_B=0, lot_S=0, lot=0;
   
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic)
            if(OrderSymbol()==Symbol())
              {
               double lt = OrderLots();
          
               if(OrderType()==OP_BUY)
                 lot_B=lot_B+lt;       // Суммируем все лоты ордеров на покупку 
               if(OrderType()==OP_SELL)
                 lot_S=lot_S+lt;       // Суммируем все лоты ордеров на продажу 
              } 
       if(type==OP_BUY)                // Если мы хотим посчитать лот очередного ордера на покупку, то
         lot=lot_S*2-lot_B;            // Берем удвоенный суммаррный лот на продажу и  
                                       // вычитаем все, что до этого успели выставить по покупкам.
                                       // В итоге, на уровне покупок у нас будет ровно в 2 раза > продаж.
       if(type==OP_SELL)               // Если мы хотим посчитать лот очередного ордера на продажу, то
         lot=lot_B*2-lot_S;            // Берем удвоенный суммаррный лот на покупку и  
                                       // вычитаем все, что до этого успели выставить по продажам.
                                       // В итоге, на уровне продаж у нас будет ровно в 2 раза > покупок.
           
    return(NormalizeDouble(lot, 2));   // В 2 разза можно заменить на KLot. Тоже интересно получится, если потестить.
}
//+------------------------------------------------------------------+
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 10:48
комментарий был удален 2022-04-07 12:05:05 kvashnin007

+
0
А вот измененный советник для желающих потестить и покритиковать.

Советник HedgeMartinStop с сайта. Изменен порядок расчета цены, снижена нагрузка, увеличена доходность. Советник можно тестировать. Но в нем есть баги. Со стопом, думаю, разберусь сам. А с функцией расчета лота попрошу кого-нибудь из спецов разобраться. Не могу найти ошибку. Функция Lot2() в конце кода.

А как код то добавить?

Хочу добавить код, а сайт выдает кпасное окошко, что комментарий больше 3000 символов.
Редактирован: 7 апреля 2022, 13:09
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

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

  16  ssg Сообщений: 817

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

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

  16  ssg Сообщений: 817

  • 7 апреля 2022, 13:13
+
0
Еще надо знать, где это у меня.
Ладно я и так понял. Но вроде видел, что-то подлиннее.
Даю первую часть.

//+------------------------------------------------------------------+
//|                                              HedgeMartinStop.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double         Loss           = 417;      // убыток в валюте
extern double         Profit         = 5;        // профит в валюте
extern double         Lots           = 3.1;      // лот
extern double         KLot           = 2.5;         // увеличение лота
//extern double         OrderSL        = 800;       // Ограничение убытка ордера
extern double         MaxLot         = 10;        // максимальный лот
extern int            Delta          = 55;        // дельта
extern int            Slip           = 30;        // проскальзывание
extern int            Magic          = 123;       // магик
input ENUM_TIMEFRAMES TF_ATR         = PERIOD_M5; // Тайм Фрейм для ATR
extern int            PerATR         = 21;        // Период ATR
extern double         Level          = 0.0009;    // уровень

double buy=0,sel=0;
int num=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double atr=iATR(Symbol(),TF_ATR,PerATR,0);

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

   if(CountTrades()<1 && atr>Level)  // Если ордеров на графике нет ATR стало больше уровня
     {
      if(CountOrders(OP_BUYSTOP)<1)  // то, если нет Buy Stop ордеров
        {
         PutOrder(OP_BUYSTOP, buy);
         buy=NormalizeDouble(Bid+Delta*_Point,_Digits);
        }

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

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

      if(LastOrderType()==2)
        {
         DelOrder();
         if(CountOrders(4)<1)
            PutOrder(4,buy);
        }
      num=CountTrades();
     }
/*   Comment("\n Profit: ",DoubleToString(AllProfit(),2),
           "\n Last Order Type: ",LastOrderType(),
           "\n Count Trades: ",CountTrades());*/
  }
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 13:16
+
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,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastOrderType()
  {
   int type=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               type=1; //buy
               break;
              }
            if(OrderType()==1)
              {
               type=2; //sell
               break;
              }
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double profit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               profit+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(int type)
{
   double lot=Lots;
   
   if(CountTrades()>0 && type==OP_BUY)
      lot=Lots*MathPow(KLot,CountTrades())*3/4;
   if(CountTrades()>0 && type==OP_SELL)
      lot=Lots*MathPow(KLot,CountTrades())*3/4;


      lot=NormalizeDouble(lot, 2);
      
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|      Замена  функции double Lot(int type)                        |
//+------------------------------------------------------------------+
double Lot2(int type)
{
   double lot_B=0, lot_S=0, lot=0;
   
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic)
            if(OrderSymbol()==Symbol())
              {
               double lt = OrderLots();
          
               if(OrderType()==OP_BUY)
                 lot_B=lot_B+lt;       // Суммируем все лоты ордеров на покупку 
               if(OrderType()==OP_SELL)
                 lot_S=lot_S+lt;       // Суммируем все лоты ордеров на продажу 
              } 
       if(type==OP_BUY)                // Если мы хотим посчитать лот очередного ордера на покупку, то
         lot=lot_S*2-lot_B;            // Берем удвоенный суммаррный лот на продажу и  
                                       // вычитаем все, что до этого успели выставить по покупкам.
                                       // В итоге, на уровне покупок у нас будет ровно в 2 раза > продаж.
       if(type==OP_SELL)               // Если мы хотим посчитать лот очередного ордера на продажу, то
         lot=lot_B*2-lot_S;            // Берем удвоенный суммаррный лот на покупку и  
                                       // вычитаем все, что до этого успели выставить по продажам.
                                       // В итоге, на уровне продаж у нас будет ровно в 2 раза > покупок.
           
    return(NormalizeDouble(lot, 2));   // В 2 разза можно заменить на KLot. Тоже интересно получится, если потестить.
}
//+------------------------------------------------------------------+



avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

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

  16  ssg Сообщений: 817

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

  16  ssg Сообщений: 817

  • 7 апреля 2022, 14:32
+
0
Здравствуйте SSG.
С нормализацией лота Вы мне ничего нового не сказали. Советник не торговый, а тестовый. Этого достаточно. Но все одно, спасибо. Ладно, без шуток.

Советник набирает позиции на двух образовавшихся как-то (сейчас это не важно, как) уровнях. Сверху Buy снизу Sell. Чтобы советник заработал денег, при выходе цены из канала (например, вверх) надо, чтобы лотов на покупку было бы больше, чем на продажу. Чтобы рост прибыли от них был больше роста убытка противоположных ордеров. Я взял соотношение 1 к 2. При достижении какого-то минимального профита минусовые ордера, чтоб не мешать, закрываются с убытком при положительном (оно всегда такое, но вы поняли) эквити. Зато плюсовые с двойным энтузиазмом (блин, горбатого могила выпрямит) будут повышать эквити.

Так вот, задача этой функции в расчете очередного лота таким образом, чтобы лотов на этом уровне было бы в два раза больше, чем на противоположном.
Обычно, по классике, лот просто увеличивают в *К_Lot раз от последнего. Ну так проще. А проще, в данном случае, не синоним лучшего. Возьмите карандашик и посчитайте: в моем варианте лотов на четверть меньше, а расстояния туда-сюда дл БУ сохраняется. Где-то в глубине души моего ноута должен был сохраниться рисунок с подсчетами. Найду — выложу. А пока на пальцах.
Редактирован: 8 апреля 2022, 19:03
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 20:34
+
0
Нашел, правда, не ту (картинку), что хотел, но тоже…


Редактирован: 8 апреля 2022, 19:06
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 20:58
+
0
Это принцип работы обычного советника HedgeMartin.
avatar

  20  alex30774 Сообщений: 748

  • 7 апреля 2022, 21:14
+
0
Не только его. Удвоение лота от последнего.
lot=Lots*MathPow(KLot,CountTrades()); Это формула исходника.

При K_Lot=0 LotStart=1 лотность изменяется от уровня к уровню так
1- старт; дальше 1*(2 в степени 1)=2; 1*(2 в степени 2)=4… Стоп.
В исходнике int CountTrades() не имеет типа, поэтому функция считает все ордера без типа.

Дальнейшие размышления в коде первоисточника ниже.Думаюю. что даже эти предлагаемые изменения значительно повлияют на заработоспособность советника. Странно другое, формула в исходнике уже стала эталоном. А я ей не верю.Станиславский, блин.

<code>//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(CountTrades()>0)
      lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
  // lot=Lots*MathPow(KLot,CountTrades()); Счетчик трейдов считает все открытые ордера.
  // Пусть KLot=2.0 и Lots=1.00.
  // Тогда первый ордер откроется просто стартовым лотом.
  // Второй лот уже будет 1.00*(2.0, возведенную в степень CountTrades()=1. 1*(2 в 1-ой ст.)= 2.00 лота.
  // CountTrades()=3.00. 1*(2 в 3-ей степени). Это уже третий лот уже равен 16. А сколько будет 2 в 19-ой ст.?
  // Блин, что-то я не втыкаю. Логарифм какой-то нарисовался. Где-то я пЛОХ. Надо тестить.
  // В моем понимании, наиболее подходящая к классике формула, должна выглядеть где-то так:
  //  lot(OP_BUY)=NormalizeDouble(KLot*LastOpderLot(OP_SELL),2);
  // lot(OP_SELL)=NormalizeDouble(KLot*LastOpderLot(OP_BUY),2);
//+------------------------------------------------------------------+
</code>


Блин… Сам дурак. Почему второй ордер считаю в первой степени, а третий в третьей, а не второй?
Редактирован: 29 января 2023, 11:37
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 01:58
+
0
Теперь оцифрую мысль.
Купили 1 лот. Цена пошла вниз на ширину канала. Продали лотом 1*2=2. Цена не дошла до БУ и и поднялась на уровень «byu», опять покупаем лотом весь Sell*2 минус имеющийся пока Buy=1. Итого SumSelLot*2 и — Sum Buy Lot'
Т.е. 2*2-1=3. Второй ордер на Buy будет не 4 лота, как обычно, а 3.
В результате Лотов на покупку будет 4, а на продажу в два раза меньше — 2 лота.
Следующий откат к Sell лот на продажу будет 4*2-2=6 лотов. 6 лотов и предыдущие открытые 2 лота на продажу, составят 8 лотов, а на покупку останется 4 лота. 1 к 2.

На картинке расчетные лоты в теле треугольников, а справа лоты по классическому расчету.
Редактирован: 7 апреля 2022, 22:02
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 7 апреля 2022, 21:19
+
0
Мало того, что с формулой лажа, так все время забываю, что работа идет отложками. Короче, шерстить весь алгоритм надо. Позже. Покимарить надо мальца.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

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

  16  ssg Сообщений: 817

  • 8 апреля 2022, 11:50
+
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

  16  ssg Сообщений: 817

  • 8 апреля 2022, 13:11
+
0
Советником, который выложил здесь двумя частями. По контрольным точкам. Сеты дефолтные. Телефон мощнее моего ноута. Правда, в ноуте есть возможность хоть что-то делать.

Но советник, по-хорошему, еще надо допиливать.
Редактирован: 8 апреля 2022, 14:02
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 13:59
+
0
Спасибо. Тоже нашел ошибку. Подправил Ваш код. Теперь ордера открываются и при OrderSL=0. Правда, ее еще надо причесать.

<code>//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
     if(OrderSL>0)
        SL=NormalizeDouble(price+sl,Digits);
      else SL=0;
     }
   if(type==OP_BUYSTOP)
     {
     clr=clrBlue;
  //   lot=Lot(OP_SELL);
     if(OrderSL>0)
        SL=NormalizeDouble(price-sl,Digits);
      else SL=0;
     }

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

Редактирован: 8 апреля 2022, 14:49
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 14:46
+
0
Добрый день SSG. Ну и имя Вам папа дал. Не выговоришь и пером…
Хорошо, что я на диванчике валялся, а так бы со стула упал от Вашего вопроса. Извините, опять понесло. Скоро отпустит.

1. Давайте определимся: Вы программист?

2. Именно по этому направлению у меня разработана своя стратегия, ибо тема очень интересная. Дело в том, что сам мой алгоритм тяжело поддается формализации. Для формализации крайне необходимо полезное общение с «гуру». Ибо есть много полезных функция, с которыми я еще не подружился (например struct state(.,.,.,...)) и которые со мной сотрудничать не хотят. Убивают непонятными ошибками.
Алгоритм, как я говорил, математически безрисковый. Проделана огромная работа по снижению нагрузки на депо. Здесь без таблиц не обойтись. А это для меня в ближайшие годы не достижимо. Поэтому алгоритм разбавил самостоятельной стратегией названной мной «Минером». Здесь, в основном, применяется трал прибыли-убытка. Не совсем рационально. Я разработал свою систему защиты, но она (зараза) приносит прибыли больше, чем основная стратегия. Это по моим расчетам. И, как говорят врачи, все хорошо, но есть нюанс.
Т.е. это сложно и никто не возьмется. А зря.

3. Много идей по вопросам открытия ордеров, при чем не важно на какой индикатор трейдер опирается. Страхуемся от залипания" индюка и выжимаем максимум. Комбинированный trailingStop, Фрактальный трал прибыли-убытка, Разработал идею советника «Defender». Простой алгоритм, а тоже ошибками завалил. Пишешь все логично (мой конек — логика и вероятность), а не работает.
Но есть одно НО. Всюду пишут про уровень не ниже 3. Я еще не дорос.

4. Честно говоря, я не делал заявок с просьбами написать по моему алгоритму.
Я пока анализирую те советники, что здесь созданы или доработаны. Часто возникают вопросы, но ответы спецы не торопятся давать. Видимо, я что-то делаю не так. Стиль программирования попадается однобокий. Правильное использование готовых, проверенных (кем?) функций. Это рационально и здесь оправдано. Для меня, пока, почти ничего интересного. Но учеба всегда была бременем. Я не жалуюсь. Считаю, что перешел во второй класс. Главное, чтоб не остался на второй год.

5. И все же, что Вы имели ввиду, задавая свой вопрос?
Редактирован: 8 апреля 2022, 19:20
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

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

  16  ssg Сообщений: 817

  • 8 апреля 2022, 14:41
+
0
Да, меня мучает вопрос с формулой
lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);

Представьте, Цена все время вверх. Пирамидимся buy лотами, рассчитанными по этой формуле. 1 лот, потом 2 лота, а потом? И потом? Посчитайте по формуле «руками». Я удивился или сильно ошибся. Вопрос: первое или второе?

Что с моей функцией расчета лота не так?
Редактирован: 8 апреля 2022, 15:00
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

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

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

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

avatar

  16  ssg Сообщений: 817

  • 8 апреля 2022, 14:59
+
0
Просадка. Смотрите на относительную. Оно в любой момент может. При 10.000 центах пять лотов это всего лишь… А фиг его знает. Я пока не об этом. Настроить можно и на лот 0.01.
Редактирован: 8 апреля 2022, 19:27
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 15:07
+
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>


Редактирован: 8 апреля 2022, 15:14
avatar

  16  ssg Сообщений: 817

  • 8 апреля 2022, 15:13
комментарий был удален 2022-04-08 22:08:08 kvashnin007

+
0
Идею я понял. Спасибо.
Но эта идея просчитывалась под удвоение лота, как в чистом мартине. Но «грязный» мартин иногда (вообще-то чаще) эффективнее.
Редактирован: 8 апреля 2022, 22:15
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 22:07
+
0
Так я и считаю отдельно, только короче. Посмотрите Lot2().
. Принты дают нормальные суммы, а вот итоговый лот регулярно минусовой и с кучей знаков после запятой. Даже с нормализацией. Лом в голове сломал. Пока решил по другому. результаты посмотрите в новом сове.

На счет алгоритм пощупать. Предлагаю начать с простого. Потом к нему добавить еще одну штучку, ну а потом, когда клиент (тезка мой Андрей) созреет, тогда добить его самым вкусным. Параллельно скриптанем еще стратегию «Минер». Потом соберем все до кучи. Будет бомба, но ее нельзя раздавать. Не потому, что жалко. Наломаем дров
Редактирован: 8 апреля 2022, 22:10
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

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

  16  ssg Сообщений: 817

  • 8 апреля 2022, 15:23
+
0
Изюминка этого хэджа в том, что он каналит в моменты нарастающей активности. Ловит хайп на движухе. Это не я. Это мой внук так говорит. Так что… извиняйте.
Редактирован: 8 апреля 2022, 22:22
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 22:21
+
0
А как это в привате? Я не в курсах.
Счас добиваю следующий вариант. Сброшу с настройками и быстрыми тестом по КТ. Попробовал по тикам, так ноут вообще отключился.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 18:05
комментарий был удален 2022-04-08 19:31:46 kvashnin007

+
0
Отчет весь не отправлю. Не знаю как.
Общее: За последний год, по КТ, на Дневке, Евро-Доллар, 179 сделок, наибольшая просадка 0.47%, относительная — 8.68%.
Из 1.000 сделал 69.089. Не смейтесь — Lot 5,01. Тестер был ограничен пятью.
Пробуйте. Настройки дефолтные.

//+------------------------------------------------------------------+
//|                                             HedgeMartinStop3.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "3.00"
#property strict

//--- Inputs
extern double         Loss           = 417;       // убыток в валюте
extern double         Profit         = 5;         // профит в валюте
extern double         Lots           = 3.0;       // лот
extern double         KLot           = 2.5;       // увеличение лота
extern double         OrderSL        = 90;        // Ограничение убытка ордера
extern double         MaxLot         = 10;        // максимальный лот
input ENUM_TIMEFRAMES TF_ATR         = PERIOD_M5; // Тайм Фрейм для ATR
extern int            PerATR         = 21;        // Период ATR
extern double         Level          = 0.0009;    // уровень
extern int            Delta          = 55;        // дельта
extern int            Slip           = 30;        // проскальзывание
extern int            Magic          = 123;       // магик

double buy=0,sel=0;
int num=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double atr=iATR(Symbol(),TF_ATR,PerATR,0);

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

   if(CountTrades()<1 && atr>Level)  // Если ордеров на графике нет ATR стало больше уровня
     {
      if(CountOrders(OP_BUYSTOP)<1)  // то, если нет Buy Stop ордеров
        {
         PutOrder(OP_BUYSTOP, buy);
         buy=NormalizeDouble(Bid+Delta*_Point,_Digits);
        }
      if(CountOrders(OP_SELLSTOP)<1)
        {
         PutOrder(OP_SELLSTOP,sel);
         sel=NormalizeDouble(Bid-Delta*_Point,_Digits);
        }
     }

   // открытие последующих ордеров
   if(num!=CountTrades())
     {
     if(LastOrderType()==1)
        {
        DelOrder();
        if(CountOrders(5)<1)
           PutOrder(5,sel);
        }
      if(LastOrderType()==2)
        {
        DelOrder();
        if(CountOrders(4)<1)
           PutOrder(4,buy);
        }
      num=CountTrades();
     }
/*   Comment("\n Profit: ",DoubleToString(AllProfit(),2),
           "\n Last Order Type: ",LastOrderType(),
           "\n Count Trades: ",CountTrades());*/
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type, double price=0)
{
   int r=0;
   color  clr = clrNONE;
   double SL  = 0;
   double sl  = OrderSL*Point;

   if(type==OP_SELLSTOP)
     {
     clr=clrRed;
     if(OrderSL>0)
        SL=NormalizeDouble(price+sl,Digits);
      else SL=0;
     }
   if(type==OP_BUYSTOP)
     {
     clr=clrBlue;
     if(OrderSL>0)
        SL=NormalizeDouble(price-sl,Digits);
      else SL=0;
     }
   r=OrderSend(Symbol(),type,Lot(type),NormalizeDouble(price,Digits),Slip,SL,0,"",Magic,0,clr);
   return;
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
{
   int count=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()<2)
               count++;
   return(count);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastOrderType()
{
   int type=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_BUY)
             return (OP_BUY);
           if(OrderType()==OP_SELL)
             return (OP_SELL);
           }
   return (-1); // Ордеров нет
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
{
   bool cl;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
           if(OrderType()==OP_BUY)
             {
             RefreshRates();
             cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
             }
           if(OrderType()==OP_SELL)
             {
             RefreshRates();
             cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
             }
           }
}
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 18:40
+
0
Добавка.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
{
   double profit=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_BUY || OrderType()==OP_SELL)
               profit+=OrderProfit()+OrderSwap()+OrderCommission();
   return(profit);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot1(int type)
{
   double lot=Lots;
   
   if(CountTrades()>0 && type==OP_BUY)
      lot=Lots*MathPow(KLot,CountTrades())*3/4;
   if(CountTrades()>0 && type==OP_SELL)
      lot=Lots*MathPow(KLot,CountTrades())*3/4;


      lot=NormalizeDouble(lot, 2);
      
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|      Замена  функции double Lot(int type)                        |
//+------------------------------------------------------------------+
double Lot2(int type)
{
   double lot_B=0, lot_S=0, lot=0;
   
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic)
            if(OrderSymbol()==Symbol())
              {
               double lt = OrderLots();
          
               if(OrderType()==OP_BUY)
                 lot_B=lot_B+lt;       // Суммируем все лоты ордеров на покупку 
               if(OrderType()==OP_SELL)
                 lot_S=lot_S+lt;       // Суммируем все лоты ордеров на продажу 
              } 
       if(type==OP_BUY)                // Если мы хотим посчитать лот очередного ордера на покупку, то
         lot=lot_S*2-lot_B;            // Берем удвоенный суммаррный лот на продажу и  
                                       // вычитаем все, что до этого успели выставить по покупкам.
                                       // В итоге, на уровне покупок у нас будет ровно в 2 раза > продаж.
       if(type==OP_SELL)               // Если мы хотим посчитать лот очередного ордера на продажу, то
         lot=lot_B*2-lot_S;            // Берем удвоенный суммаррный лот на покупку и  
                                       // вычитаем все, что до этого успели выставить по продажам.
                                       // В итоге, на уровне продаж у нас будет ровно в 2 раза > покупок.
           
    return(NormalizeDouble(lot, 2));   // В 2 разза можно заменить на KLot. Тоже интересно получится., если потестить.
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+





avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 18:41
+
0
Сюда можно Lot от эквити прицепить, но в тестере это бесполезно

avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 18:44
+
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.Судя по данной переписке советник интересует только нас. Предлагаю перенести переписку в приватную плоскость. Используйте в верхнем левом углу функции «создать запись»или функцию «Приват» под этим сообщением.
Редактирован: 8 апреля 2022, 19:55
avatar

  16  ssg Сообщений: 817

  • 8 апреля 2022, 19:54
+
0
1. Я уже не раз сообщал Вам, что не имею возможности тестировать на тиках. Посмотрел советник который вы заказали, доработал и отдал Вам на сравнение. На тиках он уже не будет граалем. Просто сравниваю его начальные возможности с измененными. Теплится надежда, что и на тиках, он не обпажается.

2. Я раньше писал, что пробую варианты. Не заработал один, вместо четырех действий я одним «выключаю» функцию. Переименовал и к ней никто не обращается. Так гораздо удобнее. По крайне мере для меня. Мешает удалите или закройте слешами.

3. Торгует одним лотом — это информация об ошибке в коде. За информацию спасибо. Буду разбираться.

Функция LastOrderLot(). По коду видно, что она ищет по времени открытия лот самого последнего открытого ордера на покупку или продажу в зависимости от запроса по переменной type. Цель — взять последний противоположный и увеличить его в KLot раз. Это и должна делать функция Lot(). Видимо не делает. Над этим буду работать.

Скорее всего… и прочие домыслы. Обычный цикл и одно действие. Функцию быстрее написать, чем где-то искать. По крайней мере для меня.

На счет ошибок:-"-Иванов, за диктант двойка. У тебя ошибки."
-" Марья Ивановна, а где? Я их не вижу. Покажите."
— " Ошибки и все. Двойка."
Я же уже говорил, что я не торгую советниками. Я пока учусь. Судя по Вашим кодам, копировать Вы тоже умеете. На все вопросы, что я задал с целью поиска ошибок, Вы ни то что бы не ответили, а даже не послали, куда всех посылают. Это, поверьте, говорит о многом.

4. По теме: Судя… и т.д. Во первых Вы не представились. Кто такой НАС, я тоже не знаю. Ведете Вы себя, как очкарик старшеклассник, временно замещающий пионЭр-вожатую. Я не вижу Вашей цели. Не понимаю с кем общаюсь. Не понимаю уровня Ваших компетенций и не только в программировании. Что Вы то хотите? Попробуйте быть проще. В жизни часто помогает. За 60 лет я в этом регулярно убеждался. И еще не надо мной пытаться манипулировать. Не люблю. Внуки — это другое. Хотите свежих идей и готовы нормально общаться, добро пожаловать в приват. Или откажите. Я не обидчивый.


Редактирован: 8 апреля 2022, 22:29
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 21:58
+
0
То же, но с другими, более агрессивными настройками.
Сделок за год 3080, было 1.000 стало 460.000 баксов, абсолютная просадка 1.46%, относительная 28.06%. Проверить бы, хотя бы, на тиках.


Редактирован: 8 апреля 2022, 19:58
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 19:56
+
0
Озвучьте сначала алгоритм советника как Вы его видите. По пунктам 1,2,3,..,10.
Только тогда можно будет написать советник, а то сейчас как то все сумбурно происходит.Не будет прописанного алгоритма (плана) то и не будет и толку.
avatar

  16  ssg Сообщений: 817

  • 8 апреля 2022, 20:06
+
0
PDf,world,exel,zip, наконец, можно как-то передавать?
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 20:27
+
0
Это Вы о чем?
avatar

  16  ssg Сообщений: 817

  • 8 апреля 2022, 20:51
+
0
Перечисленное выше это расширения файлов. Файл содержит информацию, но, изредка, бывает пустым. С помощью файлов можно обмениваться информацией. Так вот вопрос состоит в том, какими файлами и как в условиях блога можно обмениваться? дайте ссылку, где можно получить эту информацию. Видите ли каждый человек обладает большой долей личной ментальности. Ему, иногда, бывает проще объясняться с помощью картинок. Только политруки обучены объяснять все и всем на пальцах. Я инженер. Дважды. Мне проще на абрисе и калькуляторе.

Я имел ввиду именно это.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 23:13
+
0
Почему опять контрольные точки а не тики. И опять дневки. У Вас индикатор на 5 минут. Тестируйте тоже на пять минут.
avatar

  16  ssg Сообщений: 817

  • 8 апреля 2022, 20:10
+
0
Не вижу связи. Хотя, если для Вас это важно, поставьте Curent и прогоните в поиске других внешних переменных. Принцип работы советника в построении канала при повышении активности рынка. Где повышение застало, там и испражняется. Пятиминутка быстрее и чаще реагирует на повышение активности рынка.

Да и за тики уже не раз говорил: не могу или не умею. Такое впечатление, что я пытаюсь Вам втюхать что-то. Посмотрел, что Вы заказывали, немного подправил и предложил оценить исправления. Если Ваша база позволяет исследовать, как следует, буду благодарен, если поделитесь результатами.
Редактирован: 8 апреля 2022, 20:41
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 8 апреля 2022, 20:28
+
0
Или Вы «шутить изволите» или Вам нужно изучить работу тестера.
1.При тестировании тестеру известна история а также открытие, закрытие, максимальная и минимальная цена бара на котором идет тестирование.Это так называемые «контрольные точки». Отсюда и название метода тестирования.
2.Всего у тестера есть три метода тестирования
— по контрольным точкам,
— по ценам открытия,
— по тикам.
Выбор метода определяется и выбирается в строке «Модель»тестера.
Так что потрудитесь ознакомиться с работой тестера, поможет в будущем не потерять деньги из за сомообмана из за ложных итогов в тестере.
Поисковики Вам в помощь.
Ликбез устраивать не буду.
3.Не я к Вам обратился за помощью.
4.Как работает советник я знаю.И если мне его писал Андрей а не я сам себе — значит были на это причины.
5.Покажите пожалуйста что Вы «немного подправили» в советнике и это работает.
«Лоскутные одеяла» не работающих кусков кода не в счет.
6.Хотите воплотить в жизнь идею своего «бомбического» алгоритма и «таинственного» скрипта — можем пообщаться.Обсуждать старую идею желания нет.
avatar

  16  ssg Сообщений: 817

  • 8 апреля 2022, 21:18
+
0
Ну смешно, право.
Во-первых я не волшебник, а только учусь.
Во вторых, согласно закона Мура сложность, мощность и пр. вычислений каждый год удваивается. Возведите 2 в пятую степень и вы узнаете на каком калькуляторе я работаю. Вся исходная информация Вам была дана еще до этого.
В-третьих, Вы забыли о таком понятии, как архив котировок.
В-четвертых, ни на один вопрос (это о помощи) Вы не дали ответа. Так в чем помощь, то?
Судя по копи-пасту из какого-то консервативного советника, Вы не понимаете, как работает Ваш советник. Вывод: не до конца уловили идею автора. А Андрей, на которого Вы ссылаетесь, просто исполнил Ваши хотелки. Не удивительно. Судя по тому, что я вижу, кроме него никто не кодит. Я не знаю, где он может найти время на вникание. Это не реально. Но молодец. Сказывается опыт в этом деле.
Ликбез Вы устроить не можете. Компетенций маловато. Логика у Вас, ну… как у моей жены. Ах, как она пельмени делает… Советник подправленный я Вам дал в двух вариантах. Сравните и найдите разницу. Да, сравнивать можно как изнутри, так и снаружи. Это насчет одеяла.
Больше всего мне понравился шестой пункт.
Ну во-первых (опять), Вы все время забываете, что общаетесь с Одесситом.
«Бомбический» алгоритм, это по-нашенски. Профит.
Во-вторых «таинственный» скрипт умеет очень быстро закрывать отрицательные локи. При чем с большой выгодой. Финансовой имеется ввиду. Ставьте вместо SL в рабочей стратегии равновесные замки и при накоплении лимита ордеров или просадки выравниваете по лотам все ордера и в течение 1-3 дней — занимаетесь «разминированием».
В-третьих, Вы так и не ответили, кто такой МЫ.
В-четвертых, Вы не читаете то, что я Вам пишу. Я давно предложил Вам пообщаться в привате на вполне разумных условиях. Подходят — добро пожаловать.


Редактирован: 9 апреля 2022, 00:33
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 9 апреля 2022, 00:09
+
0
4.Судя по данной переписке советник интересует только нас.
В-третьих, Вы так и не ответили, кто такой МЫ.

Мы — это Вы и я. Больше в переписке здесь никто не участвует, хотя может и читают.
avatar

  16  ssg Сообщений: 817

  • 9 апреля 2022, 05:13
+
0
За Вами же не угонишься. Вы то тексты редактируете задним числом, то удаляете часть переписки…
В моём понимании «помощь»-это не сделать за кого то его работу, а сделать эту работу вместе.
avatar

  16  ssg Сообщений: 817

  • 9 апреля 2022, 09:26
+
0
Да и просто так, без пунктов. Старые идеи нужно обсуждать с целью их развития. Как говорит моя дочь-хирург: здоровых людей нет. Есть недообследованные.
Эта идея, единственная легальная безрисковая. Все остальные, из обнаруженных мною, имеют какую-то степень риска. Хоть порой и не плохие.
Профессор все знает в своей математике, а баба Клава с 3-мя классами, мало того, что таблицу умножения знает, так она еще и борщ умеет.
Это я к тому, что шоры нужны лошадям. А если мне говорят «гуру», что здесь денег нет, значит надо именно здесь и искать.
Причины две. Возможно где-то рядом грааль закопали, а во вторых, здесь никто не ищет.

Вы же знаете, что биржа, для того, что бы у ребенка игрушку забрать. Обладая безграничными возможностями, они создают роботов против любой известной стратегии. Мало того, они сливаю эти стратегии. И как только толпа освоит очередную супер, так их деньги становятся чужими. И так будет всегда. Лет 20 назад я ходил на курсы по сливу депозита. Добывал супер индикаторы. А когда надоело топтаться на месте, шутки ради начал работать против индикаторов перед началом евросессий. Попробуйте на дэмо. С тех пор я забил на индикаторы. Использую просто как тригер. Начальный толчек. Я давно не торгую. Упустил момент. Балую на дэмке. В этом моя слабость. Но призерство в физико-математических конкурсах в сочетании с «железной логикой» дают свои результаты. Я таки разработал лет за 6-ть математическую модель типа пофиг куда цена идет, лишь бы куда-нибудь шла. Поставил такого сова и спи спокойно. Главное предельная осторожность. Это важно, хоть и не все понимают.

Редактирован: 9 апреля 2022, 00:36
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 9 апреля 2022, 00:34
+
0
Исправленный, с двумя вариантами расчета лота на выбор Старый-новый. И со SL.





<code>//+------------------------------------------------------------------+
//|                                             HedgeMartinStop2.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double         Loss           = 708;       // убыток в валюте
extern double         Profit         = 18;        // профит в валюте
extern bool           StarVar        = false;     // Старый вариант расчета лота
extern double         Lots           = 1.0;       // лот
extern double         KLot           = 2.5;       // увеличение лота
extern double         OrderSL        = 33;        // Ограничение убытка ордера
extern double         MaxLot         = 12;        // максимальный лот
extern int            Delta          = 22;        // дельта
input ENUM_TIMEFRAMES TF_ATR         = PERIOD_M5; // Тайм Фрейм для ATR
extern int            PerATR         = 21;        // Период ATR
extern double         Level          = 0.0003;    // уровень
extern int            Slip           = 30;        // проскальзывание
extern int            Magic          = 123;       // магик
//---

double buy=0,sel=0;
int num=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double atr=iATR(Symbol(),TF_ATR,PerATR,0);

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

   if(CountTrades()<1 && atr>Level)  // Если ордеров на графике нет ATR стало больше уровня
     {
      if(CountOrders(OP_BUYSTOP)<1)  // то, если нет Buy Stop ордеров
        {
         PutOrder(OP_BUYSTOP, buy);
         buy=NormalizeDouble(Bid+Delta*_Point,_Digits);
        }

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

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

      if(LastOrderType()==2)
        {
         DelOrder();
         if(CountOrders(4)<1)
            PutOrder(4,buy);
        }
      num=CountTrades();
     }
/*   Comment("\n Profit: ",DoubleToString(AllProfit(),2),
           "\n Last Order Type: ",LastOrderType(),
           "\n Count Trades: ",CountTrades());*/
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
     if(OrderSL>0)
        SL=NormalizeDouble(price+sl,Digits);
      else SL=0;
     }
   if(type==OP_BUYSTOP)
     {
     clr=clrBlue;
     lot=Lot(OP_BUYSTOP);
     if(OrderSL>0)
        SL=NormalizeDouble(price-sl,Digits);
      else SL=0;
     }

   r=OrderSend(Symbol(),type,lot,NormalizeDouble(price,Digits),Slip,SL,0,"",Magic,0,clr);
   return;
  }//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
</code>

Редактирован: 9 апреля 2022, 12:50
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 9 апреля 2022, 02:22
+
0
Исправленный, вторая часть.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastOrderType()
  {
   int type=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               type=1; //buy
               break;
              }
            if(OrderType()==1)
              {
               type=2; //sell
               break;
              }
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double profit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
               profit+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(int type)
{
   double lot=Lots;
   
   if(CountTrades()>0 && type==OP_BUY)
     if (StarVar)
       lot=Lots*MathPow(KLot,CountTrades());//*3/4;
     else
       lot=LastOrderLot(OP_SELL)*KLot;
    //---  
   if(CountTrades()>0 && type==OP_SELL)
     if (StarVar)
       lot=Lots*MathPow(KLot,CountTrades());//*3/4;
     else
       lot=LastOrderLot(OP_BUY)*KLot;

      lot=NormalizeDouble(lot, 2);
      
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(OrderType()==OP_BUY  && cl>time)
              {  
              time = cl; 
              lot  = lt;
              }
            if(OrderType()==OP_SELL)
              {
              time = cl; 
              lot  = lt;
              }
           }
   return(NormalizeDouble(lot, 2));
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+


avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 9 апреля 2022, 02:23
+
0
Гонял по контрольным точкам, как автор топика, результат сильно отличается.
Вот с настройками по умолчанию:




вот с лотом 5.1 как у атора


avatar

  20  alex30774 Сообщений: 748

  • 9 апреля 2022, 13:41
+
0
Я не уточнял у автора, но возможно дело в истории или четырех-пятизнак.
У меня тоже далеко от приемлемых результатов, даже «по контрольным точкам:) ».
avatar

  16  ssg Сообщений: 817

  • 9 апреля 2022, 13:57
+
0
Дело не в истории, я просто сразу не обратил внимание, что он на дневках торговал(не весь топик прочитал):





а вот по всем тикам правда депозит 3000, так как 1000 советник слил меньше чем за год:





Время тестирования с 05.04.2021 по 08.04.2022
avatar

  20  alex30774 Сообщений: 748

  • 9 апреля 2022, 19:43
+
0
alex30774, день добрый.
Я не предлагаю рабочий советник. Просто немного изменил представленный здесь. Тестировать даже на КТ для меня проблематично. Предложил заказчику советника проверить, есть ли улучшение. Я смог только проследить разницу в работе на КТ исходника и доработанного. Эффект был очень приличный, но это не по тикам. По тикам на дефолте у меня и родной красноту выдает в журнал. Если Ваша база позволяет сделать подгонку хотя бы за три месяца на тиках и сравнить с дефолтником, был бы вам благодарен. К стати, помогли найти кое какие ошибки. Так что разместил в топике исправленный вариант.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 9 апреля 2022, 20:00
+
0
пятизнак
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 9 апреля 2022, 20:02
+
0
Если Ваша база позволяет сделать подгонку хотя бы за три месяца на тиках и сравнить с дефолтником, был бы вам благодарен


Если вы под подгонкой понимаете оптимизацию, то у меня очень слабый ноутбук(слабый процесор:2 Ггц,; встроенная видеокарта; и очень мало места на диске).Уж очень долго у меня она длится.
avatar

  20  alex30774 Сообщений: 748

  • 9 апреля 2022, 20:19
+
0
Спасибо.
Как мы с Вами похожи. Усы что ли сбрить?..
Пробуйте, если что, второй вариант.
Да и попробуйте протестировать со старыми переменными. Может там были около нужных.
Удачи.
Редактирован: 9 апреля 2022, 20:29
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 9 апреля 2022, 20:26
+
0
Второй вариант по тикам тоже хранически льёт без каких либо предпосылок к росту депозита.



avatar

  20  alex30774 Сообщений: 748

  • 9 апреля 2022, 21:38
+
0
Спасибо. Забудьте за него пока. Не тратте сил. Будет что нбудь новое, сообщу.
avatar

  7  kvashnin007 Автор Сообщений: 598 - Андрей

  • 10 апреля 2022, 13:11

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