НЕВАЛЯШКА. Что за зверь такой?

Всем доброго.
Руслан по фамилии ruslan71 предложил обсосать, доставшийся ему советник. Говорят, писанный на какой-то конкурс.Мабудь врут.
Самому обсасывать грустно, поэтому Вы и увидели эту страницу.

Идея советника проста для понимания и формализации.

Суть:
открыли стартовым лотом покупки или продажи (орёл-решка) со своими SL и ТР.
Достигнув чего ни будь, ордер закрывается.
Закрылся в профит — открываем тем же лотом и в ту же степь.
Закрылся с убытком -встречный ордер удвоенным лотом.

Это по классике. Вернее по классике ордера не закрываются по SL. Вместо этого открывается встречный ордер удвоенным лотом. Как вариант — можно рассмотреть.
В предъявленном советнике сделан первый шаг по сокращению залоговых средств, практически, с сохранением прибыльности.
Но и такой алгоритм, по идее, сливной. Сольёт на первом же продолжительном «флэте». А так — зверюга ещё тот. Потискать охота.

Как обычно, приветствуется участие в обсуждении и доработке советника.
На начальном этапе информация будет открыта для всех, а на этапе создания защиты от слива — уйдёт в приват. Есть мыслишки.
  • +8
  • Просмотров: 10706
  • 3 июля 2022, 22:36
  • kvashnin007
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

  Предыдущая запись в моем блоге
Советник по идее Шамана. Часть3.
Следующая запись в моем блоге  
Сова на индюке. Наверное верзом до вокзала.
09 июня 2022
06 августа 2022

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

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

+
0
Руслан предоставил мне сову. Я пообрезал излишний жирок. Так удобнее. Добывающая часть осталась без изменений.
С разрешения Руслана выкладываю его для обсуждения.
//+------------------------------------------------------------------+
//|                                            EA_Reversal v.1.0.mq4 |
//|                              Copyright 2017, wayfarer to Ispolin |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, wayfarer to Ispolin"
#property link      "http://forum.roboforex.ru/showthread.php?t=40284&page=72&p=1223715&viewfull=1#post1223715"
#property description "По царскому указу Ispolin, сотворен робот от числа 29.07.17"
#property description "Модификация от 25.04.18"
#property version   "1.00"
#property strict

#define MODE_BUY   0
#define MODE_SELL  1

//--- input parameters
input double   Lot         = 0.05;    // Лот базовый
input int      StopLoss    = 371;     // Потери в пунктах
input int      TakeProfit  = 352;     // Прибыль в пунктах
input double   Martingale  = 2.2;     // Коэф. увеличения лота
input int      Slip        = 30;      // проскальзывание
input int      Magic       = 1961;    // проскальзывание

struct CHK 
   {bool SL; 
   bool TP; 
   int OrdType; 
   int Cnt; 
   double Lots;
   };
CHK ChkPos;
int Dec;
int ModeTrade = 1;       // Первая сделка
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     Dec=DecStep();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   bool Buy=false, Sell=false;   
   ChkPos.SL=false;
   ChkPos.TP=false;
   ChkPos.OrdType=-1;
   ChkPos.Lots=Lot;
   double StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   
   int CntPos=CheckPos();
     
   if (CntPos==0)     // нет позиций и ордеров 
      {
      if (ChkPos.SL)  // последняя сделка закрылась в убыток
         {
         // переворот направления
         Sell= ChkPos.OrdType==OP_BUY;
         Buy = ChkPos.OrdType==OP_SELL;
         }
      else // направление сделки согласно настроек
         {
         Buy = ModeTrade==MODE_BUY;      //????????????????????????????????????????????
         Sell= ModeTrade==MODE_SELL;
         }
     
      if (ChkPos.TP)   // последняя сделка закрылась в профит
         {
         Buy = ChkPos.OrdType==OP_BUY;   //????????????????????????????????????????????
         Sell= ChkPos.OrdType==OP_SELL;
         }
      }
   if (Buy)
      {
      double Lots= GetCurLot();
      double SL = StopLoss  >0 ? NormalizeDouble(Ask-  StopLoss*Point,Digits) : 0;
      double TP = TakeProfit>0 ? NormalizeDouble(Ask+TakeProfit*Point,Digits) : 0;
      if (Lots>0) 
         OpenOrd(OP_BUY, Lots, Ask, SL, TP);
      }
   if (Sell)
      {
      double Lots= GetCurLot();
      double SL = StopLoss  >0 ? NormalizeDouble(Bid+  StopLoss*Point,Digits) : 0;
      double TP = TakeProfit>0 ? NormalizeDouble(Bid-TakeProfit*Point,Digits) : 0;
      if (Lots>0) OpenOrd(OP_SELL, Lots, Bid, SL, TP);   
      }
}
//-------------------------------------------------------------------------------
bool OpenOrd(int nMode, double Lots, double Price=0, double SL=0, double TP=0)
{
   bool ret=false, DataReady=false;
   int err, i=1;
   double PriceMarket, StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   color ClrPos=White;
   PriceMarket=0;
   
   while (i<=5 && !IsStopped())
      {
      RefreshRates();
      if (nMode==OP_BUY)
         {
         Price      =Price>0 ? Price : Ask;
         PriceMarket=Ask;
         ClrPos=Blue;
         DataReady=true;
         }
      if (nMode==OP_SELL)
         {
         Price      =Price>0 ? Price : Bid;
         PriceMarket=Bid;
         ClrPos=Red;
         DataReady=true;
         }
      // если данные готовы запускаем ордер
      if (DataReady)
         {
         if (OrderSend(Symbol(), nMode, Lots, Price, Slip, SL, TP," ",Magic,0,ClrPos)>0)
            {
            ret=true;
            break;
            }
         else
            {
            DataReady=false;
            i++;
            err = GetLastError();
            
            if (err==ERR_SERVER_BUSY   ||
                err==ERR_NO_CONNECTION ||
                err==ERR_MARKET_CLOSED ||
                err==ERR_BROKER_BUSY   ||
                err==ERR_REQUOTE       ||
                err==ERR_TRADE_CONTEXT_BUSY)
               {
               Sleep(i*5000);
               Print("Открываю ордер, попыта № ", i);
               continue;
               }

            if (err==ERR_INVALID_PRICE ||
                err==ERR_INVALID_STOPS ||
                err==ERR_INVALID_TRADE_VOLUME)
               {
               Print("Цена  рынка=", PriceMarket);
               Print("Цена ордера=", Price);
               Print("Цена     SL=", SL);
               Print("Цена     TP=", TP);
               Print("Лот=", Lots);
               }
            break;
            }
         }
      else break;
      }
   return(ret);
}
// --------------------------------------------------------------------
double GetCurLot()
{
   string Symb     = Symbol();                             // Финансовый инструм.
   double One_Lot  = MarketInfo(Symb,MODE_MARGINREQUIRED); //Стоим. 1 лота
   double Min_Lot  = MarketInfo(Symb,MODE_MINLOT);         // Мин. размер. лотов
   double Max_Lot  = MarketInfo(Symbol(),MODE_MAXLOT);     // Макс. размер. лотов
   double Step     = MarketInfo(Symb,MODE_LOTSTEP);        //Шаг изменен размера
   double Free     = AccountFreeMargin();                  // Свободные средства
   double Lots_New = Lot;
   
   if (ChkPos.SL) Lots_New=NormalizeDouble(ChkPos.Lots*Martingale,Dec);
   if (Lots_New>0)
      {
      // Средств НЕ хватает.
      if(Lots_New*One_Lot>AccountFreeMargin())      
         // Расчёт лота
         Lots_New=NormalizeDouble(MathFloor(Free/One_Lot/Step)*Step, Dec);
      }
   if (Lots_New < Min_Lot) 
      Lots_New=Min_Lot;    // миниамальный
   if (Lots_New > Max_Lot) 
      Lots_New=Max_Lot;    // максимальный
   if  (Lots_New*One_Lot > AccountFreeMargin()) // Не хватает даже на минимальн. лот<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/005.gif' alt=' ( '> 
      {
      Print("Не достаточно средств для минимального лота"); // Сообщение..
      return(0);                                // ..и выход 
      }
   return(Lots_New);
}
//------------------------------------------------------------------
int CheckPos()
{
   int Cnt=0;
   for (int i = OrdersTotal() -1; i >=0; i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
          Cnt++;
   //---       
   ChkPos.Cnt=Cnt;
   for (int trade = OrdersHistoryTotal()-1; trade >=0; trade--)
      if(OrderSelect(trade,SELECT_BY_POS,MODE_HISTORY))
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType()==OP_BUY || OrderType()==OP_SELL))
            {
            if (StringFind(OrderComment(),"[sl]")>-1 && iBarShift(NULL,0,OrderCloseTime())==0 && Cnt==0)
               {
               ChkPos.OrdType=OrderType();
               ChkPos.SL=true;
               ChkPos.Lots=OrderLots();
               break;
               }
            if (StringFind(OrderComment(),"[tp]")>-1 && iBarShift(NULL,0,OrderCloseTime())==0 && Cnt==0)
               {
               ChkPos.OrdType=OrderType();
               ChkPos.TP=true;
               ChkPos.Lots=OrderLots();
               break;
               }
            }
   return(Cnt);
}
// --------------------------------------------------------
int DecStep() // разрядность лотов
{
   double step = MarketInfo(Symbol(),MODE_LOTSTEP);
   int dec=2;
   if (0.01<=step && step<0.1) dec=2;
   if (0.1<= step && step<1)   dec=1;
   if (  1<= step && step<10)  dec=0;
   return(dec);
}
// ------------------------------------------------------------



avatar

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

  • 3 июля 2022, 22:46
+
0
Код советника для моего уровня знакомства с программированием сложноват, по-этому я переписал его «своими словами». Дальше будем работать с ним.

<code>#property strict

//--- input parameters
enum MODE {
          Buy    = 0,  // Покупка
          Sell   = 1,  // Продажа
          Candle = 2   // По свече
          };
//---          
input MODE     ModeFirstTrade = Buy;     // Тип первой сделки
input double   StartLot       = 0.02;    // Лот базовый
input int      StopLoss       = 372;     // Потери в пунктах
input int      TakeProfit     = 354;     // Прибыль в пунктах
input double   LotK           = 2.2;     // Коэф. увеличения лота
input int      Slippage       = 30;      // Slippage
input int      MagicNumber    = 1961;    // Magic Number
//---                                          
int      LastCloseType; 
double   LastCloseLot;
double   LastCloseProfit;
double   tp,sl,Lot;
bool     Trade = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
      tp = NormalizeDouble(TakeProfit*Point,Digits);
      sl = NormalizeDouble(StopLoss*Point,Digits);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
      int b=0,s=0;
   
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  if(OrderType()==OP_BUY)  b++;
                  if(OrderType()==OP_SELL) s++;
                  }
      //---
      LastCloseType=-1;
      datetime CloseTime=0;
      
      for(int i=OrdersHistoryTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  if(OrderCloseTime()>CloseTime)
                     {
                     CloseTime       = OrderCloseTime();
                     LastCloseType   = OrderType();
                     LastCloseLot    = OrderLots();
                     LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap();
                     }
      //--------------- Открытие самого первого ордера --------------------------------
      if(Trade==false)                                  // Торговля советником не начата
         if(s+b==0 && LastCloseType==-1)                // Нет и не открывались ордера
            {
            if(ModeFirstTrade == Buy)
               {
               int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  } 
               else
                  Trade = true;   
               }
            //--- 
            if(ModeFirstTrade == Sell)
               {
               int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  }    
               else
                  Trade = true;   
               }
            //---
            if(ModeFirstTrade == Candle)
               {
               }
            } 
      //--------------- Открытие последующих ордеров ----------------------------
      if(LastCloseProfit>0 && s+b==0)
         {
         Lot = StartLot;
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         }
      //----------------------------   
      if(LastCloseProfit<0 && s+b==0)
         {
         Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2);
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         }
      //--------------- Установка ТР и SL ----------------------------
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  double oop = OrderOpenPrice();
                  
                  if(OrderType()==OP_BUY)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                     
                  if(OrderType()==OP_SELL)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                  }
}
//-------------------------------------------------------------------------------
</code>


Редактирован: 3 июля 2022, 23:34
avatar

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

  • 3 июля 2022, 22:56
+
0
Да… и в приват я приглашаю тех, с кем интересно.
Редактирован: 3 июля 2022, 23:05
avatar

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

  • 3 июля 2022, 23:04
+
0
Первые мысли вслух.

SL и ТР как бы дают шаг сетки. С фиксированными шагами туда сюда.
1. Надо подбирать такой вариант, где бы SL был бы меньше ТР. Если научимся бороться с флетами, Это снизит просадку и даст прирост дэпо.
2. Видится вариант — SL и ТР брать коэффициентом от ATR какого-то периода.
При этом пункт №1 не теряет актуальность.
3. Ещё интересен на пробу вариант открывать сделки по какому ни будь индюку.
Редактирован: 4 июля 2022, 20:33
avatar

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

  • 4 июля 2022, 20:32
+
0
График оптимизации советника без привязки к ATR выглядит так.


С привязкой выглядит хуже.

#property strict

//--- input parameters
enum MODE {
          Buy    = 0,  // Покупка
          Sell   = 1,  // Продажа
          Candle = 2   // По свече
          };
//---          
input MODE            ModeFirstTrade      = Buy;       // Тип первой сделки
input double          StartLot            = 0.02;      // Лот базовый
input double          SL_k_ATR            = 1.1;       
input double          TP_k_ATR            = 0.9;       
input double   LotK                       = 2.2;       // Коэф. увеличения лота
input int             Per_ATR             = 9;
input ENUM_TIMEFRAMES TF                  = PERIOD_M5; // Тайм Фрейм для ATR
input ENUM_TIMEFRAMES TF_ATR              = PERIOD_H1; // Тайм Фрейм для расчета входа
input int             Slippage            = 30;        // Slippage
input int             MagicNumber         = 1961;      // Magic Number
//---                                          
int      LastCloseType, iB=1; 
double   LastCloseLot;
double   LastCloseProfit;
double   tp,sl,Lot;
bool     Trade = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
      int b=0,s=0;
   
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  if(OrderType()==OP_BUY)  b++;
                  if(OrderType()==OP_SELL) s++;
                  }
      //---
      LastCloseType=-1;
      datetime CloseTime=0;
      
      for(int i=OrdersHistoryTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  if(OrderCloseTime()>CloseTime)
                     {
                     CloseTime       = OrderCloseTime();
                     LastCloseType   = OrderType();
                     LastCloseLot    = OrderLots();
                     LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap();
                     }
      //--------------- Открытие самого первого ордера --------------------------------
      if(Trade==false)                                  // Торговля советником не начата
         if(s+b==0 && LastCloseType==-1)                // Нет и не открывались ордера
            {
            if(ModeFirstTrade == Buy)
               {
               int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  } 
               else
                  Trade = true;   
               }
            //--- 
            if(ModeFirstTrade == Sell)
               {
               int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  }    
               else
                  Trade = true;   
               }
            //---
            if(ModeFirstTrade == Candle)
               {
               }
            } 
      //--------------- Открытие последующих ордеров ----------------------------
      if(LastCloseProfit>0 && s+b==0)
         {
         Lot = StartLot;
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         }
      //----------------------------   
      if(LastCloseProfit<0 && s+b==0)
         {
         Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2);
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         }
      //--------------- Расчет ТР и SL -------------------------------              
      double atr     = iATR(NULL,TF_ATR,Per_ATR,iB)*10000;  // ATR (in pips)
	   double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
	   
      sl = NormalizeDouble(atr*SL_k_ATR*Point,Digits);
      if(sl<StopLvl)
         sl=StopLvl;
      tp = NormalizeDouble(atr*TP_k_ATR*Point,Digits);
      if(tp<StopLvl)
         tp=StopLvl;
      //--------------- Установка ТР и SL ----------------------------
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  double oop = OrderOpenPrice();
                  
                  if(OrderType()==OP_BUY)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                     
                  if(OrderType()==OP_SELL)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                  }
}
//-------------------------------------------------------------------------------



Этот факт говорит о плохой повторяемости результатов.
Тобишь, сдвинув период времени тестирования хоть на неделю, с огромной вероятностью сова сольёт.

Попробую применить правило сейфа. А вдруг?
Редактирован: 5 июля 2022, 20:09
avatar

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

  • 5 июля 2022, 20:06
+
0
График оптимизации без привязки к ATR, но с функцией Сейф.
<code>#property strict

//--- input parameters
enum MODE {
          Buy    = 0,  // Покупка
          Sell   = 1,  // Продажа
          Candle = 2   // По свече
          };
//---          
input bool     BU_ON          = true;
input MODE     ModeFirstTrade = Buy;     // Тип первой сделки
input double   StartLot       = 0.02;    // Лот базовый
input int      StopLoss       = 372;     // Потери в пунктах
input int      TakeProfit     = 354;     // Прибыль в пунктах
input double   LotK           = 2.2;     // Коэф. увеличения лота
input int      Slippage       = 30;      // Slippage
input int      MagicNumber    = 1961;    // Magic Number
//---                                          
int      LastCloseType; 
double   LastCloseLot;
double   LastCloseProfit;
double   tp,sl,Lot;
bool     Trade = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
      tp = NormalizeDouble(TakeProfit*Point,Digits);
      sl = NormalizeDouble(StopLoss*Point,Digits);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
      int b=0,s=0;
   
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  if(OrderType()==OP_BUY)  b++;
                  if(OrderType()==OP_SELL) s++;
                  }
      //---
      LastCloseType=-1;
      datetime CloseTime=0;
      
      for(int i=OrdersHistoryTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  if(OrderCloseTime()>CloseTime)
                     {
                     CloseTime       = OrderCloseTime();
                     LastCloseType   = OrderType();
                     LastCloseLot    = OrderLots();
                     LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap();
                     }
      //--------------- Открытие самого первого ордера --------------------------------
      if(Trade==false)                                  // Торговля советником не начата
         if(s+b==0 && LastCloseType==-1)                // Нет и не открывались ордера
            {
            if(ModeFirstTrade == Buy)
               {
               int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  } 
               else
                  Trade = true;   
               }
            //--- 
            if(ModeFirstTrade == Sell)
               {
               int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  }    
               else
                  Trade = true;   
               }
            //---
            if(ModeFirstTrade == Candle)
               {
               }
            } 
      //--------------- Открытие последующих ордеров ----------------------------
      if(LastCloseProfit>0 && s+b==0)
         {
         Lot = StartLot;
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         }
      //----------------------------   
      if(LastCloseProfit<0 && s+b==0)
         {
         Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2);
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         }	   
      //--------------- Расчет ТР и SL -------------------------------              
	   double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
	   
      sl = NormalizeDouble(StopLoss*Point,Digits);
      if(sl<StopLvl)
         sl=StopLvl;
      tp = NormalizeDouble(TakeProfit*Point,Digits);
      if(tp<StopLvl)
         tp=StopLvl;
      //--------------- Установка ТР и SL ----------------------------
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  double oop = OrderOpenPrice();
                  
                  if(OrderType()==OP_BUY)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                     
                  if(OrderType()==OP_SELL)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                  }
         if(BU_ON) BU();
}
//-------------------------------------------------------------------------------
bool BU()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              {
              double  sl_min = MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,
                      TP = OrderTakeProfit(),
                      op = OrderOpenPrice(),
                      lt = OrderLots();
              double _lt = NormalizeDouble(lt/2,2);
//              if (_lt==0) break;
              
              double LevelBU = MathAbs(op-TP);
                     
              if(OrderType()==OP_BUY && Ask >= op+LevelBU/2*Point)
                if(OrderModify(OrderTicket(),op,NormalizeDouble(Ask-sl_min,Digits),OrderTakeProfit(),0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Bid,Slippage))
                    Sleep(500);
              //---
              if(OrderType()==OP_SELL && Bid <= op-LevelBU/2*Point)
                if(OrderModify(OrderTicket(),op,NormalizeDouble(Bid+sl_min,Digits),OrderTakeProfit(),0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Ask,Slippage))
                    Sleep(500);
              }
   return true;
}
//-------------------------------------------------------------------------------
</code>



Редактирован: 5 июля 2022, 22:14
avatar

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

  • 5 июля 2022, 22:09
+
0
График оптимизации с привязкой к ATR и с функцией Сейф.
#property strict

//--- input parameters
enum MODE {
          Buy    = 0,  // Покупка
          Sell   = 1,  // Продажа
          Candle = 2   // По свече
          };
//---          
input MODE            ModeFirstTrade      = Buy;       // Тип первой сделки
input bool            BU_ON               = true;
input double          StartLot            = 0.02;      // Лот базовый
input double          SL_k_ATR            = 0.9;       
input double          TP_k_ATR            = 1.9;       
input double   LotK                       = 2.2;       // Коэф. увеличения лота
input int             Per_ATR             = 9;
input ENUM_TIMEFRAMES TF                  = PERIOD_M5; // Тайм Фрейм для ATR
input ENUM_TIMEFRAMES TF_ATR              = PERIOD_H1; // Тайм Фрейм для расчета входа
input int             Slippage            = 30;        // Slippage
input int             MagicNumber         = 1961;      // Magic Number
//---                                          
int      LastCloseType, iB=1; 
double   LastCloseLot;
double   LastCloseProfit, LevelBU;
double   tp,sl,Lot;
bool     Trade = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
      int b=0,s=0;
   
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  if(OrderType()==OP_BUY)  b++;
                  if(OrderType()==OP_SELL) s++;
                  }
      //---
      LastCloseType=-1;
      datetime CloseTime=0;
      
      for(int i=OrdersHistoryTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  if(OrderCloseTime()>CloseTime)
                     {
                     CloseTime       = OrderCloseTime();
                     LastCloseType   = OrderType();
                     LastCloseLot    = OrderLots();
                     LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap();
                     }
      //--------------- Открытие самого первого ордера --------------------------------
      if(Trade==false)                                  // Торговля советником не начата
         if(s+b==0 && LastCloseType==-1)                // Нет и не открывались ордера
            {
            if(ModeFirstTrade == Buy)
               {
               int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  } 
               else
                  Trade = true;   
               }
            //--- 
            if(ModeFirstTrade == Sell)
               {
               int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
               if(ticket<0)
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  }    
               else
                  Trade = true;   
               }
            //---
            if(ModeFirstTrade == Candle)
               {
               }
            } 
      //--------------- Открытие последующих ордеров ----------------------------
      if(LastCloseProfit>0 && s+b==0)
         {
         Lot = StartLot;
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         }
      //----------------------------   
      if(LastCloseProfit<0 && s+b==0)
         {
         Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2);
         
         if(LastCloseType==OP_BUY)
            {
            int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         if(LastCloseType==OP_SELL)
            {
            int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); 
            if(ticket<0)
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         }
      //--------------- Расчет ТР и SL -------------------------------              
      double atr     = iATR(NULL,TF_ATR,Per_ATR,iB)*10000;  // ATR (in pips)
	   double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
	   
      sl = NormalizeDouble(atr*SL_k_ATR*Point,Digits);
      if(sl<StopLvl)
         sl=StopLvl;
      tp = NormalizeDouble(atr*TP_k_ATR*Point,Digits);
      if(tp<StopLvl)
         tp=StopLvl;
         
      //--------------- Установка ТР и SL ----------------------------
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  double oop = OrderOpenPrice();
                  
                  if(OrderType()==OP_BUY)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                     
                  if(OrderType()==OP_SELL)
                    if(OrderStopLoss()==0 || OrderTakeProfit()==0)
                      if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue))
                        Print("Order Modify error #",GetLastError());
                  }
         if(BU_ON) BU();
}
//-------------------------------------------------------------------------------
bool BU()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              {
              double  sl_min = MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,
                      TP = OrderTakeProfit(),
                      op = OrderOpenPrice(),
                      lt = OrderLots();
              double _lt = NormalizeDouble(lt/2,2);
//              if (_lt==0) break;
              
              LevelBU = MathAbs(op-TP);
                     
              if(OrderType()==OP_BUY && Ask >= op+LevelBU/2*Point)
                if(OrderModify(OrderTicket(),op,NormalizeDouble(Ask-sl_min,Digits),OrderTakeProfit(),0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Bid,Slippage))
                    Sleep(500);
              //---
              if(OrderType()==OP_SELL && Bid <= op-LevelBU/2*Point)
                if(OrderModify(OrderTicket(),op,NormalizeDouble(Bid+sl_min,Digits),OrderTakeProfit(),0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Ask,Slippage))
                    Sleep(500);
              }
   return true;
}
//-------------------------------------------------------------------------------

avatar

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

  • 5 июля 2022, 22:18
+
0
Последние два варианта говорят против ATR. Не могу понять причину.
Видимо Значения SL и ТР часто меньше стоплевела и поэтому не отрабатывают, как задумывалось. Вижу только один вариант(последний) уйти в виртуальные SL-ТР.
Потом попробую. Пока спать.
Редактирован: 5 июля 2022, 22:53
avatar

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

  • 5 июля 2022, 22:23
+
0
Нашел причину такого поведения ATR. Тестировать SL_k_ATR и ТР_k_ATR надо в большем диапазоне. От 0 до 100 и более. Особенно SL. Так что ATR скидывать со счетов пока рановато.



А пока кардинально повлиять на алгоритм не удалось.
Думаю надо
1. пробовать поработать по свечам.
2. привязаться к какому-то индюку.
Теперь точно спать.
Редактирован: 6 июля 2022, 08:07
avatar

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

  • 5 июля 2022, 22:58
+
0
Традиционная просьба: соберите пожалуйста все учтённое и добавленное в единый файл готового у пробам советника! С выкладкой его тут :) 
avatar

  11  preasto Сообщений: 445

  • 8 июля 2022, 16:11
+
0
Уважаемый preasto, видите ли я не считаю необходимым выкладывать сборник всего, включая то, что не оправдало себя.
Например, коэффициенты для SL и ТР от ATR в моих тестах показали плохие результаты. Но я ещё ТОТ тестер. Может надо было дойти до М1?
Советник этот выложен тут последним. Никто не написал ничего по этому поводу. Даже не пробовали тестировать. Все ждут когда я сломаюсь.

Да ради бога. Я это сделал. Теперь работаю исключительно для себя.
Буду по мере продвижения выкладывать здесь закрытые ограниченные файлы продвижения. Может ничего и не выйдет толкового.
avatar

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

  • 8 июля 2022, 21:36
+
0
А пробовали неваляшку сделать, чтоб противоположная отложка тянулась за ордером с заданным шагом в пипсах или по времен (например цена ушла на 100пунктов, двигаем на 50 к ордеру ближе отложку, или прошло пол 2-3 часа цена куда-то ушла — тоже двигаем отложку к ордеру)?
Редактирован: 6 июля 2022, 12:33
avatar

  5  cesar781 Сообщений: 43

  • 6 июля 2022, 12:32
+
0
Нет не пробовал. Пока что только цену для открытия тралил.
avatar

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

  • 6 июля 2022, 21:33
+
0
Интересно, буду следить за развитием.
avatar

  18  Boris54 Сообщений: 810 - ПенSионер

  • 8 июля 2022, 15:55
+
+1
А вообще-то, поковырявшись в неваляшке, я понял её главную идею.
С усреднителями-мартышками не работает. А с любым другим советником при SL торгуем по направлению алгоритма советника, но удваиваем лот от нормы.

Поле не паханное. К половине советников можно приложить.
Редактирован: 8 июля 2022, 21:49
avatar

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

  • 8 июля 2022, 21:48
+
0
По просьбе preasto собрал сборную солянку.
Хотя далёк от мысли, что это даст результат.
Если бы тестирующие давали обратную связь, что такое хорошо, что такое плохо!!!
А лично моих мощностей не хватает, чтобы протестировать всё и сразу.
Не… пенсию просчитал быстро и без ошибок. Так что Надежда Ивановна есть.
Это последний открытый код. Далее ухожу в подполье. Там бочонок с вином.
avatar

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

  • 9 июля 2022, 15:41
+
0
1-ая часть для «склейки».
#property strict

// Ввёл усреднение на откатах Average=true, но сильно не тестировал.
// PointOrderStep и MinimalProfit работают только для Average=true.
// Если SL_k_ATR=0 или TP_k_ATR=0, то StopLoss или соответственно TakeProfit подбираются в пипсах.
// Вижу смысл в подборе SL с помощью SL_k_ATR, а ТР по фиксированному значению в пипсах при TP_k_ATR=0. Хотя...
// Поробовал ввести задержку в минутах SleepMin, после получения Count_SL подряд убыточных ордеров, но
// кажется не работает. В дефолте отключена (SleepMin=0<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' ;) '> .

//--- input parameters
enum MODE {
          Buy    = 0,  // Покупка
          Sell   = 1,  // Продажа
          Candle = 2   // По свече
          };
//---          
input MODE            ModeFirstTrade = Buy;       // ModeFirstTrade Тип первой сделки
input int             Count_SL       = 3;         // Счетчик SL подряд
input int             SleepMin       = 0;         // Задержка мин. при четчике SL== 
input bool            BU_ON          = true;      // BU ON          Включение режима Save
//---
input bool            Average        = false;     // Average        Включение усредняющих ордеров
input int             PointOrderStep = 390;       // Order step (in pips)
input int             MinimalProfit  = 20;        // Minimal Profit Для усреднения ордеров      
//---
input double          StartLot       = 0.01;      // Start Lot      Лот стартовый
input double          LotK           = 2.2;       // Коэф. увеличения лота
input double          MaximalLots    = 1.28;      // Maximal Lots
//--- 
input int             StopLoss       = 372;       // Stop Loss      Потери в пунктах
input int             TakeProfit     = 354;       // Take Profit    Прибыль в пунктах
input double          SL_k_ATR       = 5;         // SL_k_ATR       Коэффициент к ATR для SL      
input double          TP_k_ATR       = 77;        // TP_k_ATR       Коэффициент к ATR для TP 
//---      
input int             Per_ATR        = 9;         // Period ATR
input ENUM_TIMEFRAMES TF             = PERIOD_M5; // Тайм Фрейм для расчета входа//---
input int             Slippage       = 30;        // Slippage
input int             MagicNumber    = 1961;      // Magic Number
//---                                   
int      iB=1, LastCloseType, tk,CountSL=0; 
double   tp,sl,Lot,lt,op;
datetime LastTimeSL=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
      int b=0,s=0; 
      
      double
      SelPriceMin = 0, SelPriceMax = 0, SelPriceMinLot = 0, SelPriceMaxLot = 0,LastCloseLot=0,
      BuyPriceMax = 0, BuyPriceMin = 0, BuyPriceMaxLot = 0, BuyPriceMinLot = 0,
      SelLimPriceMin = 0, SelLimPriceMax = 0, SelLimPriceMinLot = 0, SelLimPriceMaxLot = 0,
      BuyLimPriceMax = 0,BuyLimPriceMin=0;
   
      int
      SelPriceMaxTic = 0, SelPriceMinTic = 0,
      BuyPriceMaxTic = 0, BuyPriceMinTic = 0,
      SelLimPriceMaxTic = 0, SelLimPriceMinTic = 0,
      BuyLimPriceMaxTic = 0, BuyLimPriceMinTic = 0;
      
      string   LastCloseTP_SL="0";

   
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  op = NormalizeDouble(OrderOpenPrice(), Digits());
                  lt = NormalizeDouble(OrderLots(), 2);
                  tk = OrderTicket();
    
                  if(OrderType() == OP_SELL)
                    {
                     s++;
                     if(op > SelPriceMax || SelPriceMax == 0)
                       {
                       SelPriceMax    = op;
                       SelPriceMaxLot = lt;
                       SelPriceMaxTic = tk;
                       }
                     if(op < SelPriceMin || SelPriceMin == 0)
                       {
                       SelPriceMin    = op;
                       SelPriceMinLot = lt;
                       SelPriceMinTic = tk;
                       }
                    }
                  if(OrderType() == OP_BUY)
                    {
                    b++;
                    if(op > BuyPriceMax || BuyPriceMax == 0)
                      {
                      BuyPriceMax    = op;
                      BuyPriceMaxLot = lt;
                      BuyPriceMaxTic = tk;
                      }
                    if(op < BuyPriceMin || BuyPriceMin == 0)
                      {
                      BuyPriceMin    = op;
                      BuyPriceMinLot = lt;
                      BuyPriceMinTic = tk;
                      }
                    }
                  }
         //-------------------- AVERAGE -------------------------------------
         double   AwerageBuyPrice=0,AwerageSelPrice=0;
      
         if(Average)
            {
            if(b>=2) 
               AwerageBuyPrice=NormalizeDouble((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*BuyPriceMinLot)/(BuyPriceMaxLot+BuyPriceMinLot)+MinimalProfit*Point(),Digits());
            if(s>=2) 
               AwerageSelPrice=NormalizeDouble((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)/(SelPriceMaxLot+SelPriceMinLot)-MinimalProfit*Point(),Digits());
            }
         //-------------------- HISTORY -------------------------------------
      if(s+b==0)
         for (int i = OrdersHistoryTotal()-1; i >=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
               if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && (OrderType()==OP_BUY || OrderType()==OP_SELL))
                  {
                  if (StringFind(OrderComment(),"[sl]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
                     {
                     LastCloseTP_SL = "SL";
                     LastCloseType  = OrderType();
                     LastCloseLot   = OrderLots();
                     LastTimeSL     = OrderCloseTime();
                     CountSL ++;
                     break;
                     }
                  if (StringFind(OrderComment(),"[tp]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
                     {
                     LastCloseTP_SL = "TP";
                     LastCloseType  = OrderType();
                     LastCloseLot   = OrderLots();
                     CountSL = 0;
                     break;
                     }
                  }
      //--------------- Открытие самого первого ордера --------------------------------
         if(s+b==0 && LastCloseLot==0)                // Нет и не открывались ордера
            {
            if(ModeFirstTrade == Buy)
               {
               if(!OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  } 
               }
            //----------------------------------------------------------------- 
            if(ModeFirstTrade == Sell)
               {
               if(!OrderSend(Symbol(),OP_SELL,NL(StartLot),Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                  { 
                  Print("Order Send завершилась с ошибкой #",GetLastError());
                  return;
                  }    
               }
            //----------------------------------------------------------------- 
            if(ModeFirstTrade == Candle)
               {
               if(Close[iB] < Open[iB])
                  if(! OrderSend(Symbol(),OP_SELL,NL(StartLot),Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                     { 
                     Print("Order Send завершилась с ошибкой #",GetLastError());
                     return;
                     }    
               //-----------------
               if(Close[iB] > Open[iB])
                 if(!OrderSend(Symbol(),OP_BUY,NL(StartLot),Ask,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                   { 
                   Print("Order Send завершилась с ошибкой #",GetLastError());
                   return;
                   } 
               }
            }
            //--------------- Открытие последующих ордеров ----------------------------

avatar

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

  • 9 июля 2022, 15:45
+
0
2-ая часть для склейки.
//--------------- Открытие последующих ордеров ----------------------------
         
         datetime CurTime = iTime(NULL, TF, 0); 
                                                             
         if(CountSL<=Count_SL || CurTime>=LastTimeSL+60*SleepMin)// Если число убыточных ордеров меньше выбранного 
            {                                                    // или уже прошло указанное время после мах. числа убыточных ордеров, 
            if(ModeFirstTrade != Candle)                         // то открываем ордера дальше.
               {
               if(LastCloseTP_SL=="TP" && s+b==0)
                  {
                  Lot = NL(StartLot);
                  if(!ValidLot(Lot)) return;  
                  
                  if(LastCloseType==OP_BUY)
                     {
                     if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        } 
                     }
                  if(LastCloseType==OP_SELL)
                     {
                     if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        }    
                     }
                  }
               //----------------------------   
               if(LastCloseTP_SL=="SL" && s+b==0)
                  {
                  Lot = MathCeil((LastCloseLot * LotK)*100)/100;
                  if(Lot > MaximalLots)
                     Lot = MaximalLots;
                  Lot = NL(Lot);
                  if(!ValidLot(Lot)) return;  
                  
                  if(LastCloseType==OP_BUY)
                     {
                     if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        }    
                     }
                  if(LastCloseType==OP_SELL)
                     {
                     if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        } 
                     }
                  }
               }
            //---------------------------------------------------------------------------------------   
            if(ModeFirstTrade == Candle)
               {
               
               
               if(LastCloseTP_SL=="TP" && s+b==0)  // Нет ордеров, а полследний закрылся с профитом
                  {
                  Lot = StartLot;
                  Lot = NL(Lot);
                  if(!ValidLot(Lot)) return;  
                  
                  if(LastCloseType==OP_BUY && Close[1]>Open[1])
                     {
                     if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        } 
                     }
                  if(LastCloseType==OP_SELL && Close[1]<Open[1])
                     {
                     if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        }    
                     }
                  }
               //----------------------------   
               if(LastCloseTP_SL=="SL" && s+b==0)  // Нет ордеров, а полследний закрылся с убытком
                  {   
                  Lot = MathCeil((LastCloseLot * LotK)*100)/100;
                  if(Lot > MaximalLots)
                     Lot = MaximalLots;
                  Lot = NL(Lot);
                  if(!ValidLot(Lot)) return;  
                  
                  if(LastCloseType==OP_BUY && Close[1]<Open[1])
                     {
                     if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        }    
                     }
                  if(LastCloseType==OP_SELL && Close[1]>Open[1])
                     {
                     if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue)) 
                        { 
                        Print("Order Send завершилась с ошибкой #",GetLastError());
                        return;
                        } 
                     }
                  }
                }
             }
         //---------------- Есть ордера - усредняем с шагом ----------------------   
         if(Average)
            {
            if(s > 0 && Close[1] < Open[1])
               if((Bid - SelPriceMax) >= (PointOrderStep * Point()))
                 {
                 Lot = MathCeil(SelLimPriceMaxLot*100*LotK/100);
                 if(Lot > MaximalLots)
                    Lot = MaximalLots;
                 Lot = NL(Lot);
                 if(!ValidLot(Lot)) return;  

                 if(!OrderSend(Symbol(), OP_SELL, NormalizeDouble(Lot, 2), Bid, Slippage, 0, 0, "", MagicNumber, 0, clrRed))
                    Print("OrderSend error #", GetLastError());
                 }
            //---
            if(b > 0 && Close[1] > Open[1])
               if((BuyPriceMin - Ask) >= (PointOrderStep * Point()))
                 {
                 Lot = MathCeil(BuyLimPriceMin*100*LotK/100);
                 if(Lot > MaximalLots)
                    Lot = MaximalLots;
                 Lot = NL(Lot);
               if(!ValidLot(Lot)) return;  
                    Lot = NormalizeDouble(MaximalLots,2);

                 if((!OrderSend(Symbol(),OP_BUY, NormalizeDouble(Lot, 2), Ask, Slippage, 0, 0, "",MagicNumber, 0, clrBlue))<=0)
                    Print("OrderSend error #", GetLastError());
                 }      
            } 
            //--------------- Расчет ТР и SL -------------------------------              
         	   double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
               double atr     = iATR(NULL,TF,Per_ATR,iB)*10000;  // ATR (in pips)
               
         	if(SL_k_ATR==0)
               sl = NormalizeDouble(StopLoss*Point,Digits);
            else
               sl = NormalizeDouble(atr*SL_k_ATR*Point,Digits);
               if(sl<StopLvl)
                  sl=StopLvl;
               //---
         	if(TP_k_ATR==0)
               tp = NormalizeDouble(TakeProfit*Point,Digits);
            else
               tp = NormalizeDouble(atr*TP_k_ATR*Point,Digits);
               if(tp<StopLvl)
                  tp=StopLvl;
            //--------------- Установка ТР, SL и Average price ----------------------------
avatar

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

  • 9 июля 2022, 15:48
+
0
3-я часть для склейки
for(int i=OrdersTotal()-1;i>=0;i--)
              if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                if(OrderMagicNumber()==MagicNumber)
                   if(OrderSymbol()==Symbol())
                      {
                      op=OrderOpenPrice();
                      sl=OrderStopLoss();
                      tp=OrderTakeProfit();
                      lt=NL(OrderLots());
                      tk=OrderTicket();
                      double Price=op;
                           
                        //------------- ТР и SL ------------ 
                        if(tp==0 && TakeProfit!=0)
                           {
                           if(OrderType()==OP_BUY)                      
                              if(!OrderModify(tk,op,NSL(OP_BUY, op),NTP(OP_BUY, op),0,clrBlue))    // Устанавливаем ТР и SL
                                 Print("Order Modify 4b_tp error #",GetLastError());
                           //---
                           if(OrderType()==OP_SELL)
                              if(!OrderModify(tk,op,NSL(OP_SELL, op),NTP(OP_SELL, op),0,clrRed))   // Устанавливаем ТР и SL
                                 Print("Order Modify 4s_tp error #",GetLastError());
                           }
                                    
                        //------------------ Average ------------ 
                        if(Average)
                           {
                           if(OrderType()==OP_BUY && b>=2)
                             {
                             if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)                          // Крайние ордера
                                if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                                   if(!OrderModify(tk,op,0,AwerageBuyPrice,0,clrBlue))             // Выставляем ТР в БУ+
                                      Print("Order Modify 5b_AverTP error #",GetLastError());
                                       
                             if((tk!=BuyPriceMaxTic || tk!=BuyPriceMinTic) && tp!=0 && sl==0)      // Стали не крайними ордера
                                if(!OrderModify(tk,op,NSL(OP_BUY, op),NTP(OP_BUY, op),0,clrBlue))  // Восстанавливаем ТР и SL
                                   Print("Order Modify 5b_!AverSL&TP error #",GetLastError());
                             }
                           //---
                           if(OrderType()==OP_SELL && s>=2)                                        // С продажами аналогично
                             {
                             if(tk==SelPriceMaxTic || tk==SelPriceMinTic)                          // Крайние ордера
                                if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                                   if(!OrderModify(tk,op,0,AwerageSelPrice,0,clrRed))              // Выставляем ТР в БУ+
                                      Print("Order Modify 5s_AverTP error #",GetLastError());
            
                             if((tk!=SelPriceMaxTic || tk!=SelPriceMinTic) && tp!=0 && sl==0)      // Стали не крайними ордера
                                if(!OrderModify(tk,op,NSL(OP_SELL, op),NTP(OP_SELL, op),0,clrRed)) // Восстанавливаем ТР и SL
                                   Print("Order Modify 5s_!AverSL&TP errorerror #",GetLastError());
                             }
                           } 
                        }
            if(BU_ON) BU();
}
// --------------------------------------------------------
bool ValidLot(double volume)
{
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
      return(false);

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
      return(false);

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
      return(false);

   return(true);
}
//---------------------------------------------------------------   
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1;   // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//---------------------------------------------------------------   
double NTP(int dir, double _op) // Нормализация цены тейкпрофита
{
	if (TakeProfit==0) 
	   return 0;
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	double pr=NP((dir==OP_BUY)?Bid:Ask);
	if (dir==OP_BUY) 
	   { 
	   tp=_op+TakeProfit*Point; 
	   return NP(MathMax(tp, pr+StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   tp=_op-TakeProfit*Point; 
	   return NP(MathMin(tp, pr-StopLvl)); 
	   }
	return 0;
}
//---------------------------------------------------------------   
double NSL(int dir, double _op) // Нормализация цены стоплоса
{
	if (StopLoss==0) 
	   return 0;
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	double pr=NP((dir==OP_BUY)?Bid:Ask);
	if (dir==OP_BUY) 
	   { 
	   sl=_op-StopLoss*Point; 
	   return NP(MathMin(sl, pr-StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   sl=_op+StopLoss*Point; 
	   return NP(MathMax(sl, pr+StopLvl)); 
	   }
	return 0;
}
//---------------------------------------------------------------   
double ND(double d, int n=-1) 
   { 
   if (n<0) 
      return NormalizeDouble(d, Digits); 
   return NormalizeDouble(d, n); 
   }
//---------------------------------------------------------------   
double NP(double d) 
   { 
   double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); 
   if (TickSize==0) 
      TickSize=1; 
   return ND(MathRound(d/TickSize)*TickSize); 
   }
//-----------------------------------------------------------------
bool BU()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              {
              double  sl_min = MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,
                      TP = OrderTakeProfit();
                      op = OrderOpenPrice();
                      lt = OrderLots();
              double _lt = NormalizeDouble(lt/2,2);
//              if (_lt==0) break;
              
              double LevelBU = MathAbs(op-TP);
                     
              if(OrderType()==OP_BUY && Ask >= op+LevelBU/2*Point)
                if(OrderModify(OrderTicket(),op,NormalizeDouble(Ask-sl_min,Digits),OrderTakeProfit(),0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Bid,Slippage))
                    Sleep(500);
              //---
              if(OrderType()==OP_SELL && Bid <= op-LevelBU/2*Point)
                if(OrderModify(OrderTicket(),op,NormalizeDouble(Bid+sl_min,Digits),OrderTakeProfit(),0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Ask,Slippage))
                    Sleep(500);
              }
   return true;
}
//-------------------------------------------------------------------------------


Нифига себе солянка. Тестирование мне на годы.
avatar

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

  • 9 июля 2022, 15:50
+
+1
Сделал сову чисто по барам.
Ссылка для скачивания кому интересно disk.yandex.ru/d/XzsD7COzDjC5Ug



Это за месяц. Сильно не настраивал, но видно, что советник проседает во флете.
Дальше займусь переходом к сигналам индюка и защитой от просадки.
Редактирован: 9 июля 2022, 22:41
avatar

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

  • 9 июля 2022, 22:39
+
+1
Чисто Неваляшка по барам без дополнительных примочек.

#property strict

//--- input parameters
input ENUM_TIMEFRAMES TF             = PERIOD_H4; // Тайм Фрейм для свечей
input double          StartLot       = 0.01;      // Лот базовый
input double          LotK           = 2.2;       // Коэф. увеличения лота  
input double          MaximalLots    = 1.28;      // Maximal Lots 
input int             StopLoss       = 408;       // Потери в пунктах
input int             TakeProfit     = 353;       // Прибыль в пунктах
input int             PointOrderStep = 431;       // Point order step (in pips)
input int             Slippage       = 30;        // Slippage
input int             MagicNumber    = 1961;      // Magic Number
//---                                          
int      iB=1, LastCloseType; 
double   tp,sl,Lot,step,LastCloseLot;
datetime LastTimeSL=0;
string   LastCloseTP_SL="0";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{ 
      step =  PointOrderStep*Point; 
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
      int b=0,s=0; 
      
      //-------------------- CURENT -------------------------------------
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                  {
                  if(OrderType() == OP_SELL)
                     s++;
                  if(OrderType() == OP_BUY)
                    b++;
                  }
      //-------------------- HISTORY -------------------------------------
      if(s+b==0)
         for (int i = OrdersHistoryTotal()-1; i >=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
               if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && (OrderType()==OP_BUY || OrderType()==OP_SELL))
                  {
                  if (StringFind(OrderComment(),"[sl]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
                     {
                     LastCloseTP_SL = "SL";
                     LastCloseType  = OrderType();
                     LastCloseLot   = OrderLots();
                     break;
                     }
                  if (StringFind(OrderComment(),"[tp]")>-1 && iBarShift(NULL,TF,OrderCloseTime())==0)
                     {
                     LastCloseTP_SL = "TP";
                     LastCloseType  = OrderType();
                     LastCloseLot   = OrderLots();
                     break;
                     }
                  }
      //--------------- Открытие самого первого ордера --------------------------------
      double open1 = iOpen(Symbol(),TF,1);

      if(s+b==0 && LastCloseLot==0)                // Нет и не открывались ордера
         {
         if(Bid < open1)
            if(! OrderSend(Symbol(),OP_SELL,NL(StartLot),Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
          //---
          if(Bid > open1)
             if(!OrderSend(Symbol(),OP_BUY,NL(StartLot),Ask,Slippage,0,0," ",MagicNumber,0,clrRed)) 
                { 
                Print("Order Send завершилась с ошибкой #",GetLastError());
                return;
                } 
           }
      //--------------- Открытие последующих ордеров ----------------------------
      
         //---------------------------- последний закрылся по ТР  
      if(LastCloseTP_SL=="TP" && s+b==0)  // Нет ордеров, а полследний закрылся по ТР
         {
         Lot = StartLot;
         Lot = NL(Lot);
         if(!ValidLot(Lot)) return;  
               
         if(LastCloseType==OP_BUY && Ask>open1+step)
            {
            if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue)) 
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         if(LastCloseType==OP_SELL && Bid<open1-step)
            {
            if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         }
         //---------------------------- последний закрылся по SL  
      if(LastCloseTP_SL=="SL" && s+b==0)  // Нет ордеров, а полследний закрылся по SL
         {   
         Lot = MathCeil((LastCloseLot * LotK)*100)/100;
         if(Lot > MaximalLots)
            Lot = MaximalLots;
         Lot = NL(Lot);
         if(!ValidLot(Lot)) return;  
               
         if(LastCloseType==OP_BUY && Bid<open1-step)
            {
            if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed)) 
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               }    
            }
         if(LastCloseType==OP_SELL && Ask>open1+step)
            {
            if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue)) 
               { 
               Print("Order Send завершилась с ошибкой #",GetLastError());
               return;
               } 
            }
         }
            //--------------- Расчет ТР и SL ------------------------------- 
                         
         	double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits);
         	   
            sl = StopLoss*Point;
            if(sl<StopLvl)
               sl=StopLvl;
            
            tp = TakeProfit*Point;
            if(tp<StopLvl)
               tp=StopLvl;
               
            //--------------- Установка ТР и SL ----------------------------
            
            for(int i=OrdersTotal()-1;i>=0;i--)
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  if(OrderSymbol()==Symbol())
                     {
                     double oop = OrderOpenPrice();
                     double TP  = OrderTakeProfit();
                     double SL  = OrderStopLoss();
                     int    tk  = OrderTicket();
                     
                     if(OrderMagicNumber()==MagicNumber)
                           {
                           if(OrderType()==OP_BUY && TP==0 && SL==0)
                               {
                               if(!OrderModify(tk,oop,NSL(OP_BUY,oop),NTP(OP_BUY,oop),0,clrBlue))
                                 Print("Order Modify error #",GetLastError());
                               }
                           if(OrderType()==OP_SELL && TP==0 && SL==0)
                             if(OrderTakeProfit()==0)
                               if(!OrderModify(tk,oop,NSL(OP_SELL,oop),NTP(OP_SELL,oop),0,clrRed))
                                 Print("Order Modify error #",GetLastError());
                           }

                     }
}
//---------------------------------------------------------------   
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
avatar

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

  • 2 августа 2022, 16:24
+
+1
НЕ ВМЕСТИЛОСЬ.

<code>// --------------------------------------------------------
bool ValidLot(double volume)// Проверка лота на валидность
{
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
      return(false);

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
      return(false);

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
      return(false);

   return(true);
}
//---------------------------------------------------------------   
double NTP(int dir, double _op) // Нормализация цены тейкпрофита
{
	if (TakeProfit==0) 
	   return 0;
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	double pr=NP((dir==OP_BUY)?Bid:Ask);
	if (dir==OP_BUY) 
	   { 
	   tp=_op+TakeProfit*Point; 
	   return NP(MathMax(tp, pr+StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   tp=_op-TakeProfit*Point; 
	   return NP(MathMin(tp, pr-StopLvl)); 
	   }
	return 0;
}
//---------------------------------------------------------------   
double NSL(int dir, double _op) // Нормализация цены стоплоса
{
	if (StopLoss==0) 
	   return 0;
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	double pr=NP((dir==OP_BUY)?Bid:Ask);
	if (dir==OP_BUY) 
	   { 
	   sl=_op-StopLoss*Point; 
	   return NP(MathMin(sl, pr-StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   sl=_op+StopLoss*Point; 
	   return NP(MathMax(sl, pr+StopLvl)); 
	   }
	return 0;
}
//---------------------------------------------------------------   
double ND(double d, int n=-1) 
   { 
   if (n<0) 
      return NormalizeDouble(d, Digits); 
   return NormalizeDouble(d, n); 
   }
//---------------------------------------------------------------   
double NP(double d) 
   { 
   double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); 
   if (TickSize==0) 
      TickSize=1; 
   return ND(MathRound(d/TickSize)*TickSize); 
   }
//---------------------------------------------------------------   
</code>




За месяц, как обычно. При PointOrderStep=0 работает как обычная неваляшка, но с учетом закрытия бара. Не лучший вариант.
Редактирован: 2 августа 2022, 16:28
avatar

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

  • 2 августа 2022, 16:26
+
0
Про влияние АТР — мы же видим «вчерашние» данные. Эта задержка и даёт такую независимость?
avatar

  18  Boris54 Сообщений: 810 - ПенSионер

  • 3 августа 2022, 01:31
+
0
АТR здесь я использовал просто как единицу измерения. Рулеткой не удобно.
АТR брал за последние свечи, довольно свежие данные, но это не критично.
Подгонка под приемлемые величины у меня ограничена диапазоном и шагом как на картинке.
avatar

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

  • 5 августа 2022, 15:39
+
0
И Вообще я отказался от ATR. Толку ноль.
А вообще то я ожидал большего эффекта от своих потуг. Помощи мало, а сам быстро нахожу признаки бесперспективности. Хотя часто ошибаюсь с выводами.
Редактирован: 5 августа 2022, 15:45
avatar

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

  • 5 августа 2022, 15:42

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