Шаман. Уходят лучшие.

Вот ведь, как жизнь устроена. Уходят раньше лучшие, настоящие. Говнюки остаются. Почему? Да каждый, включая говнюков, знает почему.
Настоящие уходят, порой не оставив после себя никого. А говнюки размножаются. Так что? Все?

Да вот хрен.

Говнюк никогда не станет лидером. А воспитание отпрысков по большей части происходит не в гадюшнике с говнюками. А там где основные интересы любого. В коллективе. Если папика можно послать, то в коллективе такого не поймут. Короче, есть надежда, что настоящие не вырождаются.

Сергей ШАМАН был настоящим Сибиряком.

Хоть времени на пожить не хватает, решил таки открыть блог, который связан с именем Шамана, его советником и еще с кое- какими его мыслями.

Приветствуется любое участие.
  • +3
  • Просмотров: 6152
  • 7 апреля 2024, 09:06
  • kvashnin007
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Хотелось попробовать, покрутить, посмотреть на его советник- но, только на словах так все и кончилось, не попробовав его советника… Только на форумах и блогах, то тут то там всплывает, что он что-то делал и что-то завещал- и на этом все обрывается…
avatar

  8  evgsergej Сообщений: 27

  • 7 апреля 2024, 19:19
+
0
А то что выложил Бишоп?
avatar

  12  njdftgh Сообщений: 239 - Shoom

  • 7 апреля 2024, 19:51
+
0
но, только на словах так все и кончилось, не попробовав его советника… Только на форумах и блогах, то тут то там всплывает, что он что-то делал и что-то завещал- и на этом все обрывается…

что значит «на словах так все и кончилось» и «обрывается»? Советник Шамана выложен в том виде, в котором мне его скинули — www.opentraders.ru/downloads/3808/
avatar

  46  Bishop Сообщений: 5817 - АЛЬФАХАМЕЦ-Машковод

  • 8 апреля 2024, 10:08
+
0
Евгений Сергеевич, к сожалению, мне Шаман дал урезанную версию на ознакомление. А там я пробовал изменять индикатор и соответственно вставлял его в ЗаеБота. Что-то работало. Но сейчас прогонял в тестере, что раньше работало — сейчас ни одной сделки. Хрень какая-то. Бишоп здесь ни при чем. Думаю, что надо пробовать на старых версиях терминала. Либо перерабатывать ЗаеБота целиком, сохраняя идеи Шамана. Я не смогу. Не мой уровень.

А вообще я планировал кинуть в топик все досье от Шамана, включая те советники, которые я писал по его идее. В открытом коде. Может кому-то пригодится память за Шамана.

Вопрос в другом. Как здесь на сайте сохранять файлы? Ну не печатать же простыни в коде.
Редактирован: 9 апреля 2024, 07:06
avatar

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

  • 9 апреля 2024, 07:02
+
0
Вопрос в другом. Как здесь на сайте сохранять файлы? Ну не печатать же простыни в коде.

Загружать файлы можно двумя способами:

1) через иконку дискетки при создании топика,

2) загружать их в файловое хранилище сюда — www.opentraders.ru/downloads/
У второго способа преимущество в том, что у файла отдельно будет число просмотров и загрузок.
Для загрузки файла в хранилище нужно выбрать по ссылке выше сверху пункт Мои файлы/добавить. И дальше следовать инструкциям.
avatar

  46  Bishop Сообщений: 5817 - АЛЬФАХАМЕЦ-Машковод

  • 9 апреля 2024, 08:48
+
0
Спасибо за подгон.
avatar

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

  • 28 апреля 2024, 08:16
+
0
Я Бишоп не обвиняю… Изначально было написано, если с роботом какие-то непорядки ошибки, то его попробуют поправить. Вот я и начал писать и спрашивать. В итоге так и получается, написали про парня, кто он, кем был и чем занимался- конечно хорошо- но на этом все и кончится. А вот если его робота поправить подшаманить- тогда точно будет жить его слово вечно, все кто будет пользоваться роботом все-равно будут искать источник, а тут и биография и описание про человека который задумал его, и про тех кто был причастен к этому шедевру!!!*hi* 
avatar

  8  evgsergej Сообщений: 27

  • 9 апреля 2024, 20:37
+
+1
Ладно. Не распускаем сопли. Если все мной имеемые варианты не работают, подождем: может кто-то, пошире в плечах, сможет запустить ЗаеБота. Тогда и промоем ему косточки. А сейчас…

Ни зайцем одним успел у меня отметится Шаман.

Как-то о чем-то пикировались, а он: — А что, если сделки открывать ни туды-сюды, а в сторону общего БУ? Естественно, там был какой-то контекст. Сейчас не важно. Сказал походя и… забыл. А я, хоть и не злопамятный…

Тут то воображение разыгралось. Написал советника. Потом пробовал варианты.

Позже выложу открытый код здесь. Идея то Шамана. Не моя. А он был бы не против.
Редактирован: 10 апреля 2024, 06:25
avatar

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

  • 10 апреля 2024, 06:21
+
0
У меня где-то есть подобный робот, не помню где взял- там тоже работает по тренду, там сетка + ММ, не помню как закрывается по какому принципу- но работает прикольно. Выставляет ордера по тренду и до разварота закрывает, тренд пошел обратно- он опять начинает выставлять ордера. Бывает конечно, тренд резко меняется, то в таком случае работает в штатном по тренду
avatar

  8  evgsergej Сообщений: 27

  • 10 апреля 2024, 20:46
+
0
Блин. вроде недавно это было. а уже забыл алгоритм.
Но один нюанс помню. Подбираешь по ценам открытия, а работает и на тиках.

Вечером дам код. Щупайте, спрашивайте. Будем вспоминать. Мучать.

М5, за три месяца. Подобрал переменные по ценам открытия. Верхний рисунок.
Прогнал по этим же переменным по контрольным точкам и по тикам. Разница на лицЕ.






Редактирован: 13 апреля 2024, 10:09
avatar

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

  • 13 апреля 2024, 07:16
+
+2
Начало совы.

<code>#property strict
//---
enum ENUM_Metod
  {
   Shaman       = 0,  
   ShamanSmart  = 1,  
   Normal       = 2     
  };
input ENUM_Metod      Metod               = Shaman;    // Metod - тип работы советника, метод открытия ордеров.
input bool            Agressor            = true;      // Agressor - функция влияет только на расчет ордеров.
input bool            Revers              = false;     // Вместо SL создает полный замок.
input int             CloseLim            = 5;         // Close Limit - функция оставляет к-во ордеров в каждом направлении.
//---      
// input double          LevelStopLoss       = 0;
// input double          LevelStopProfit     = 0;
//---      
input double          StartLots           = 0.05;      // Start lot
input double          CoeffLots           = 1.7;      
input double          MaximalLots         = 2.56;      // Maximal Lot 
input int             StopLoss            = 352;       // Stop Loss (in pips)
input int             TakeProfit          = 737;       // Take Profit (in pips)
input int             PointOrderStep      = 33;        // Point order step (in pips)
input int             MinimalProfit       = 35;        // Minimal profit for close Average orders (in pips)
//---
input ENUM_TIMEFRAMES TF                  = PERIOD_H1; // Тайм Фрейм для расчета входа
input ENUM_TIMEFRAMES TF_ATR              = PERIOD_H1; // Тайм Фрейм для ATR
input int             Per_MA              = 14;
input int             LevelSell           = 22;
input int             LevelBuy            = 62;
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage 
//---
double SellBuff;
double BuyBuff;
double ShortSig;
double LongSig;
double op,lt,tp,slv;
int    tk,b,s;
int    iB=1;
double BuyPriceMax=0,BuyPriceMin=0,BuyPriceMaxLot=0,BuyPriceMinLot=0,
       SelPriceMin=0,SelPriceMax=0,SelPriceMinLot=0,SelPriceMaxLot=0;
double FullBU,BuyBU,SelBU;
//************************************************************************************************/
int OnInit()
{
     slv = StopLoss*Point;
     Comment("");
  return(INIT_SUCCEEDED);
}
//************************************************************************************************/
void OnTick()
{
   BuyPriceMax=0;BuyPriceMin=0;BuyPriceMaxLot=0;BuyPriceMinLot=0;
   SelPriceMin=0;SelPriceMax=0;SelPriceMinLot=0;SelPriceMaxLot=0;

   int
   BuyPriceMaxTic=0,BuyPriceMinTic=0,SelPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0;

   op=0;lt=0;tp=0;
   FullBU=0;
   tk=0;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())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum += lt;
                  WeighBuy   += lt*op;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax    = op;
                     BuyPriceMaxLot = lt;
                     BuyPriceMaxTic = tk;
                     }
                  if(op<BuyPriceMin || BuyPriceMin==0)
                     {
                     BuyPriceMin    = op;
                     BuyPriceMinLot = lt;
                     BuyPriceMinTic = tk;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum += lt;
                  WeighSell  += lt*op;
                  
                  if(op>SelPriceMax || SelPriceMax==0)
                     {
                     SelPriceMax    = op;
                     SelPriceMaxLot = lt;
                     SelPriceMaxTic = tk;
                     }
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin    = op;
                     SelPriceMinLot = lt;
                     SelPriceMinTic = tk;
                     }
                  }
               }
            //---
            if(b>CloseLim && CloseLim!=0)
              if(OrderClose (BuyPriceMaxTic, BuyPriceMaxLot, Bid , Slippage, clrBlue)) 
                return;
                
            if(s>CloseLim && CloseLim!=0)
              if(OrderClose (SelPriceMinTic, SelPriceMinLot, Ask , Slippage, clrRed)) 
                return;
            //---
            if(Metod!=Normal)
               if ((BuyLotsSum - SelLotsSum) != 0) 
                  FullBU = (WeighBuy - WeighSell)/(BuyLotsSum - SelLotsSum);
//*************************************************************//
   double   AwerageBuyPrice=0,AwerageSelPrice=0;
   if(b>=3) AwerageBuyPrice=NormalizeDouble
         ((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*BuyPriceMinLot)/(BuyPriceMaxLot+BuyPriceMinLot)+MinimalProfit*Point(),Digits());
   if(s>=3) AwerageSelPrice=NormalizeDouble
         ((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)/(SelPriceMaxLot+SelPriceMinLot)-MinimalProfit*Point(),Digits());
//*************************************************************//
   double BuyLot=0,SelLot=0;
   
   if(Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
         
      if(SelPriceMaxLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(!Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
         
      if(SelPriceMaxLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(Metod==ShamanSmart)
      {   
      if(SelPriceMaxLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=SelLotsSum*2;
         
      if(BuyPriceMinLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=BuyLotsSum*2;
      }
//*************************************************************//

   if(BuyLot>MaximalLots)      BuyLot=MaximalLots;
   if(SelLot>MaximalLots)      SelLot=MaximalLots;
   if(!CheckVolumeValue(BuyLot) || !CheckVolumeValue(SelLot))
      return;   
//*************************************************************//
   if(Metod==Normal)
      {
      if(Signal()==OP_BUY)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
      if(Signal()==OP_SELL)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
      }
   //---   
   if(Metod==Shaman || Metod==ShamanSmart)
     {
      if(Signal()==OP_BUY && Ask<FullBU)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
   
      if(Signal()==OP_SELL && Bid>FullBU)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
     }
</code>

Редактирован: 2 мая 2024, 12:54
avatar

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

  • 13 апреля 2024, 18:33
+
+2
Приклейте к началу.

<code>//*************************************************************//
   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());
               tp=NormalizeDouble(OrderTakeProfit(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();

               if(OrderType()==OP_BUY)
                  { 
                  if(b>=1 && tp==0)
                     if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Ask+TakeProfit*Point(),Digits()),0,clrNONE))
                        Print("OrderModify error #",GetLastError());
   
                  if(b>=3)
                     {
                     if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                        if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                           if(!OrderModify(tk,op,OrderStopLoss(),AwerageBuyPrice,0,clrNONE))
                              Print("OrderModify error #",GetLastError());
   
                     if(tk!=BuyPriceMaxTic && tk!=BuyPriceMinTic && tp!=0)
                        if(!OrderModify(tk,op,0,0,0,clrNONE))
                           Print("OrderModify error #",GetLastError());
                     }
                     
                  if(Revers && Bid<=op-slv)
                     if(OrderSend(Symbol(),OP_SELL,lt,NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
                        Print("OrderSend error #",GetLastError());
                  }
               //---                   
               if(OrderType()==OP_SELL)
                  { 
                  if(s>=1 && tp==0)
                  if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Bid-TakeProfit*Point(),Digits()),0,clrNONE))
                     Print("OrderModify error #",GetLastError());
                        
                  if(s>=3)
                     {
                     if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                        if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                           if(!OrderModify(tk,op,OrderStopLoss(),AwerageSelPrice,0,clrNONE))
                              Print("OrderModify error #",GetLastError());
   
                     if(tk!=SelPriceMaxTic && tk!=SelPriceMinTic && tp!=0)
                        if(!OrderModify(tk,op,0,0,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                     if(Revers>0 && Ask>=op+slv)
                        if(OrderSend(Symbol(),OP_BUY,lt,NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
                           Print("OrderSend error #",GetLastError());
                     }
                  }
               }
/*              //---
              double Prof = GetProfit();
              if((LevelStopLoss>0 && Prof<=-LevelStopLoss) || (LevelStopProfit>0 && Prof>=LevelStopProfit))
                ClosePlus();
              //---
              if(LevelStopLoss<0 && Prof<=LevelStopLoss)
                CloseMinus();
              if(LevelStopProfit<0 && Prof>=-LevelStopProfit)
                ClosePlus(); 
*/
 
}
//************************************************************************************************/
bool CheckVolumeValue(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);
}
//************************************************************************************************/
/*СИГНАЛ*/
//------------------------------------------------------------------	
int Signal()                   // Создаем функцию получения сигнала на указанном ТФ и баре
{
        double current_openprice = iOpen (Symbol(),TF , iB);
        double Mashka =iMA(NULL,0,Per_MA,0,0,4,iB) ;
        double Atrium=0;
        
          Atrium  = 0.2 * iATR(NULL,TF_ATR,Per_MA,iB);
         
          if(Bid>=current_openprice)                                               
            {
            SellBuff = (58000000.0 * (Bid  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Low[iB]   - Mashka) * Atrium);
            }
          if(Bid<current_openprice)
            {
            SellBuff = (58000000.0 * (High[iB]  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Bid   - Mashka) * Atrium);
            }
          if (SellBuff >  LevelSell) 
            return OP_SELL;
          
          if (BuyBuff < -LevelBuy) 
            return OP_BUY;
	return -1;                   // Иначе нет сигнала. Возвращаем в int Signai () -1 (никаких сигналов)
}
//************************************************************************************************
double GetProfit()
{  
   double Profit=0;
     
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              Profit += OrderProfit() + OrderCommission() + OrderSwap();
   return (Profit);
}
//************************************************************************************************
bool CloseAll()
{ 
   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)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
bool ClosePlus()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol() && OrderProfit()>0)
              {
              if(OrderType()==OP_BUY)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
bool CloseMinus()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol() && OrderProfit()<=0)
              {
              if(OrderType()==OP_BUY)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
</code>



Редактирован: 2 мая 2024, 12:54
avatar

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

  • 13 апреля 2024, 18:37
+
0
Убрал отключения при профите ±.
Компилируется без ошибок, а в ходе тестирования в журнал выдает критическую ошибку.
Пока нашел, дуб порезал.

Хто плохо разбирается, просто перезапишите сову, склеив две части.

Будет время допишу трал по эквити. Т.е. задаем падение эквити от текущего, ниже которого Все закрывается.
avatar

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

  • 2 мая 2024, 13:01
+
0
Просьба к вам подписывать название эксперта, к примеру:
либо в названии эксперта, либо в коде «Vers.01»,«Vers.02»,«Vers.03» и так далее, что бы не путаться.
Спасибо за понимание.
avatar

  15  OSS5 Сообщений: 168

  • 2 мая 2024, 16:11
+
0
Логично. Другое дело скидывать советники в файлообменники. Не плодить здесь простыни ради. Как тут скидывать файлы?
avatar

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

  • 2 мая 2024, 20:01
+
0
идет постоянная модернизация тп

217 строку if(b>=1 && tp==0) заменить на if(b<=2 && tp==0)
240 строку if(s>=1 && tp==0) заменить на if(s<=2 && tp==0)

avatar

  15  OSS5 Сообщений: 168

  • 2 мая 2024, 16:30
+
0
Это не логично.
Добавил одну переменную говорящую, сколько ордеров усреднения позиции нужно для начала сокращения крайних ордеров с минимальным ТР. 2-7. Я предпочитаю 3. Добавил комментариев. Почитайте и сами поймете, что ваши дополнения нарушают логику.

Советник Shaman_v1.3 опять же склейка из двух частей.


//+------------------------------------------------------------------+
//|                                                  Shaman_v1.3.mq4 |
//+------------------------------------------------------------------+
#property strict
//---
enum ENUM_Metod
  {
   Shaman       = 0,  
   ShamanSmart  = 1,  
   Normal       = 2     
  };
input ENUM_Metod      Metod               = Shaman;    // Metod - тип работы советника, метод открытия ордеров.
input bool            Agressor            = true;      // Agressor - функция влияет только на расчет ордеров.
input bool            Revers              = false;     // Вместо SL создает полный замок.
input int             CloseLim            = 5;         // Close Limit - функция оставляет к-во ордеров в каждом направлении.
input int             CountAverge         = 3;         // Количество усредняющих ордеров для сокращения с MinimalProfit.
//---      
input double          StartLots           = 0.05;      // Start lot
input double          CoeffLots           = 1.7;      
input double          MaximalLots         = 2.56;      // Maximal Lot 
input int             StopLoss            = 352;       // Stop Loss (in pips)
input int             TakeProfit          = 737;       // Take Profit (in pips)
input int             PointOrderStep      = 33;        // Point order step (in pips)
input int             MinimalProfit       = 35;        // Minimal profit for close Average orders (in pips)
//---
input ENUM_TIMEFRAMES TF                  = PERIOD_H1; // Тайм Фрейм для расчета входа
input ENUM_TIMEFRAMES TF_ATR              = PERIOD_H1; // Тайм Фрейм для ATR
input int             Per_MA              = 14;
input int             LevelSell           = 22;
input int             LevelBuy            = 62;
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage 
//---
double SellBuff;
double BuyBuff;
double ShortSig;
double LongSig;
double op,lt,tp,slv;
int    tk,b,s;
int    iB=1;
double BuyPriceMax=0,BuyPriceMin=0,BuyPriceMaxLot=0,BuyPriceMinLot=0,
       SelPriceMin=0,SelPriceMax=0,SelPriceMinLot=0,SelPriceMaxLot=0;
double FullBU,BuyBU,SelBU;
//************************************************************************************************/
int OnInit()
{
     slv = StopLoss*Point;
     Comment("");
  return(INIT_SUCCEEDED);
}
//**********************************************************************************************/
void OnTick()
{//------------------- Сначала изучаем текущую обстановку по ордерам ---------------------------/
   BuyPriceMax=0;BuyPriceMin=0;BuyPriceMaxLot=0;BuyPriceMinLot=0;
   SelPriceMin=0;SelPriceMax=0;SelPriceMinLot=0;SelPriceMaxLot=0;

   int
   BuyPriceMaxTic=0,BuyPriceMinTic=0,SelPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0;

   op=0;lt=0;tp=0;
   FullBU=0;
   tk=0;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())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum += lt;
                  WeighBuy   += lt*op;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax    = op;
                     BuyPriceMaxLot = lt;
                     BuyPriceMaxTic = tk;
                     }
                  if(op<BuyPriceMin || BuyPriceMin==0)
                     {
                     BuyPriceMin    = op;
                     BuyPriceMinLot = lt;
                     BuyPriceMinTic = tk;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum += lt;
                  WeighSell  += lt*op;
                  
                  if(op>SelPriceMax || SelPriceMax==0)
                     {
                     SelPriceMax    = op;
                     SelPriceMaxLot = lt;
                     SelPriceMaxTic = tk;
                     }
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin    = op;
                     SelPriceMinLot = lt;
                     SelPriceMinTic = tk;
                     }
                  }
               }
            //---
            if(b>CloseLim && CloseLim!=0)    // Если ордеров на покупку больше заданного (усредняющие ордера)
              if(OrderClose (BuyPriceMaxTic, BuyPriceMaxLot, Bid , Slippage, clrBlue)) // Закрываем дальний.
                return;                                                                // опять пересчитываем текучку.
                
            if(s>CloseLim && CloseLim!=0)
              if(OrderClose (SelPriceMinTic, SelPriceMinLot, Ask , Slippage, clrRed)) 
                return;
            //---
            if(Metod!=Normal)  
               if ((BuyLotsSum - SelLotsSum) != 0) 
                  FullBU = (WeighBuy - WeighSell)/(BuyLotsSum - SelLotsSum);// Определяем цену общего БУ для всех ордеров
//***************** Определение БУ+MinTP для крайник ордеров одного направления ***************************//
   double   AwerageBuyPrice=0,AwerageSelPrice=0;
   if(b>=CountAverge) AwerageBuyPrice=NormalizeDouble
         ((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*BuyPriceMinLot)/(BuyPriceMaxLot+BuyPriceMinLot)+MinimalProfit*Point(),Digits());
   if(s>=CountAverge) AwerageSelPrice=NormalizeDouble
         ((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)/(SelPriceMaxLot+SelPriceMinLot)-MinimalProfit*Point(),Digits());
//*************************************************************//
   double BuyLot=0,SelLot=0;
   
   if(Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
         
      if(SelPriceMaxLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(!Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
         
      if(SelPriceMaxLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(Metod==ShamanSmart)
      {   
      if(SelPriceMaxLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=SelLotsSum*2;
         
      if(BuyPriceMinLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=BuyLotsSum*2;
      }
//*************************************************************//

   if(BuyLot>MaximalLots)      BuyLot=MaximalLots;
   if(SelLot>MaximalLots)      SelLot=MaximalLots;
   if(!CheckVolumeValue(BuyLot) || !CheckVolumeValue(SelLot))
      return;   
//*************************************************************//
   if(Metod==Normal)
      {
      if(Signal()==OP_BUY)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
      if(Signal()==OP_SELL)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
      }
   //---   
   if(Metod==Shaman || Metod==ShamanSmart)
     {
      if(Signal()==OP_BUY && Ask<FullBU)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
   
      if(Signal()==OP_SELL && Bid>FullBU)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
     }

avatar

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

  • 2 мая 2024, 22:08
+
0
Вторая часть v_1.3


//****************  Усреднение ордеров **********************************//
   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());
               tp=NormalizeDouble(OrderTakeProfit(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();

               if(OrderType()==OP_BUY)
                  { 
                  if(b>=1 && tp==0) // Если есть ордера на покупку и их ТР=0, то выставляем ему ТР.
                                    // Откуда ТР=0? Это новый открытый, а также с обнуленным ТР. Читай дальше, когда обнуляем.
                     if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Ask+TakeProfit*Point(),Digits()),0,clrNONE))
                        Print("OrderModify error #",GetLastError());
   
                  if(b>=CountAverge)// Если ордеров на покупку не менее, чем мы определили для сокращения
                     {              // то пытаемся сократить крайние из них.
                     if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                        if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                           if(!OrderModify(tk,op,OrderStopLoss(),AwerageBuyPrice,0,clrNONE))// Dыставляем им ТР в общий БУ+.
                              Print("OrderModify error #",GetLastError());
   
                     if(tk!=BuyPriceMaxTic && tk!=BuyPriceMinTic && tp!=0)// Если появился очередной усредняющий ордер, то 
                        if(!OrderModify(tk,op,0,0,0,clrNONE))             // предыдущему (уже не крайнему) обнуляем ТР.
                           Print("OrderModify error #",GetLastError());   // затем в строках 220-223 вернем ему "родной" ТР. 
                     }
                     
                  if(Revers && Bid<=op-slv)
                     if(OrderSend(Symbol(),OP_SELL,lt,NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
                        Print("OrderSend error #",GetLastError());
                  }
               //---                   
               if(OrderType()==OP_SELL)
                  { 
                  if(s>=1 && tp==0)
                  if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Bid-TakeProfit*Point(),Digits()),0,clrNONE))
                     Print("OrderModify error #",GetLastError());
                        
                  if(s>=CountAverge)
                     {
                     if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                        if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                           if(!OrderModify(tk,op,OrderStopLoss(),AwerageSelPrice,0,clrNONE))
                              Print("OrderModify error #",GetLastError());
   
                     if(tk!=SelPriceMaxTic && tk!=SelPriceMinTic && tp!=0)
                        if(!OrderModify(tk,op,0,0,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                     if(Revers>0 && Ask>=op+slv)
                        if(OrderSend(Symbol(),OP_BUY,lt,NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
                           Print("OrderSend error #",GetLastError());
                     }
                  }
               }
}
//************************************************************************************************/
bool CheckVolumeValue(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);
}
//************************************************************************************************/
/*СИГНАЛ*/
//------------------------------------------------------------------	
int Signal()                   // Создаем функцию получения сигнала на указанном ТФ и баре
{
        double current_openprice = iOpen (Symbol(),TF , iB);
        double Mashka =iMA(NULL,0,Per_MA,0,0,4,iB) ;
        double Atrium=0;
        
          Atrium  = 0.2 * iATR(NULL,TF_ATR,Per_MA,iB);
         
          if(Bid>=current_openprice)                                               
            {
            SellBuff = (58000000.0 * (Bid  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Low[iB]   - Mashka) * Atrium);
            }
          if(Bid<current_openprice)
            {
            SellBuff = (58000000.0 * (High[iB]  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Bid   - Mashka) * Atrium);
            }
          if (SellBuff >  LevelSell) 
            return OP_SELL;
          
          if (BuyBuff < -LevelBuy) 
            return OP_BUY;
	return -1;                   // Иначе нет сигнала. Возвращаем в int Signai () -1 (никаких сигналов)
}
//************************************************************************************************
double GetProfit()
{  
   double Profit=0;
     
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              Profit += OrderProfit() + OrderCommission() + OrderSwap();
   return (Profit);
}
//************************************************************************************************
bool CloseAll()
{ 
   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)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
bool ClosePlus()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol() && OrderProfit()>0)
              {
              if(OrderType()==OP_BUY)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
bool CloseMinus()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol() && OrderProfit()<=0)
              {
              if(OrderType()==OP_BUY)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
avatar

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

  • 2 мая 2024, 22:12
+
0
Не понял сразу проблему. Постоянная модификация Таким способом не решается. Есть два ордера -есть модификация ТР в БУ+. А если ордеров становится 3, то модифицируем ТР в общий БУ+ Первый и третий, а второй мешается под ногами. Я ему должен поставить «родной» ТР. Эту проблему надо решать по-другому. Надо подумать. Решу — отпишусь.
avatar

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

  • 3 мая 2024, 07:02
+
+1
Ладно. Я хоть попытался. Всем удачи.
avatar

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

  • 16 апреля 2024, 15:40
+
+1
Тут сова www.opentraders.ru/downloads/3828/, интересно работает. Настройки по умолчанию ни о чем.
avatar

  15  OSS5 Сообщений: 168

  • 25 апреля 2024, 14:08
+
0
Смотря на каком ТФ. Подбираете на ценах открытия более менее красивый график. Тестируете на тиках.
Если все ОК. даете небольшой диапазон подбора вокруг получившихся значений и подгоняете на тиках.
Не лучший вариант, но реально быстрый.

Удачи.
avatar

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

  • 2 мая 2024, 13:04
+
0
Спасибо за эксперта.

На всех тиках всегда тестил. На выходных попробую по вашей подсказке. Я ещё добавил в код, выставление одного ордера на свечу (не так грузит депо).
avatar

  15  OSS5 Сообщений: 168

  • 2 мая 2024, 16:06
+
0
Возможно. Я тут на работе погонял на ценах открытия. С трудом нашел подходящие переменные. Так что не панацея. Давние наблюдения. Но если попробуете, то совет. По ценам открытия на 1000$ подбирайте переменные. А далее по тикам или КТ выделяйте 10000$.
Я там писал: либо перегрузите советник а Вам LevelStopLoss и LevelStopProfit лучше удалить. Либо просто оставить =0 и не подбирать. Иначе советник выдает критическую ошибку.
Удачи.
Редактирован: 2 мая 2024, 19:50
avatar

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

  • 2 мая 2024, 19:40
+
0
Вообще-то советник имеет умеренную просадку. Я даже ввел режим Агрессор.
Плюс усредняющие ордера по возможности компенсируются. Закрываются два ордера с минимальным общим ТР.А свечи, которые длинные (импульсные), как правило сразу же откатывают. Можно на одной свече заработать. Я бы не стал ограничиваться одним ордером на свече. Но вы пробуйте. Может в этом что-то есть. В одном месте потеряли, в другом чаще находим.
avatar

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

  • 2 мая 2024, 19:56
+
0
Есть успехи по тестированию?
Редактирован: 2 мая 2024, 19:17
avatar

  4  Jimirami Сообщений: 44

  • 2 мая 2024, 19:07
+
0
Занят другим.
avatar

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

  • 2 мая 2024, 19:31
+
0
Да. И еще. SL=0. Не настраивайте его сразу. Настраивайте без него. После подбора всего поставьте в настройки только SL в пределах 30-1000. Выберите SL с лучшим соотношением прибыль-просадка.

Удачи. Не забывайте делиться результатами. Это и лично Вам необходимо.
Редактирован: 2 мая 2024, 22:24
avatar

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

  • 2 мая 2024, 22:20
+
0
Вот о чем я

идет постоянная модификация.
avatar

  15  OSS5 Сообщений: 168

  • 3 мая 2024, 01:43
+
0
Не понял сразу проблему. Постоянная модификация Таким способом не решается. Есть два ордера -есть модификация ТР в БУ+. А если ордеров становится 3, то модифицируем ТР в общий БУ+ первый и третий, а второй мешается под ногами. Я ему должен поставить «родной» ТР. Эту проблему надо решать по-другому. Надо подумать. Решу — отпишусь.

Редактирован: 3 мая 2024, 07:46
avatar

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

  • 3 мая 2024, 07:45
+
0
Привет.
Мы с вами переписывались и вы сказали перезалить новую сову.
Не подскажите, где?
avatar

  7  gek63 Сообщений: 101

  • 3 мая 2024, 12:48
+
0
:) :) 
avatar

  15  OSS5 Сообщений: 168

  • 3 мая 2024, 01:44
+
0
Советник Shaman_v1.3 опять же склейка из двух частей. Смотрите выше. Там тоже есть проблемы с постоянной модификацией ТР ордеров. Позже решу — отпишусь. Сейчас пока не до этого.
Удачи.
avatar

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

  • 3 мая 2024, 15:31
+
0
Исправил постоянную модернизацию ТР ордеров. Ошибка 134 — не жадничайте. Выделяйте много депозита. Потом думать будете, что и как.

Shaman V 1.4


//+------------------------------------------------------------------+
//|                                                 Shaman_v 1.4.mq4 |
//|                                             fromme2you@yandex.ru |
//+------------------------------------------------------------------+
#property strict
//---
enum ENUM_Metod
  {
   Shaman       = 0,  
   ShamanSmart  = 1,  
   Normal       = 2     
  };
input ENUM_Metod      Metod               = Shaman;    // Metod - тип работы советника, метод открытия ордеров.
input bool            Agressor            = true;      // Agressor - функция влияет только на расчет ордеров.
input bool            Revers              = false;     // Вместо SL создает полный замок.
input int             CloseLim            = 5;         // Close Limit - функция оставляет к-во ордеров в каждом направлении.
input int             CountAverge         = 3;         // Количество усредняющих ордеров для сокращения с MinimalProfit.
//---      
input double          StartLots           = 0.05;      // Start lot
input double          CoeffLots           = 1.7;      
input double          MaximalLots         = 2.56;      // Maximal Lot 
input int             StopLoss            = 352;       // Stop Loss (in pips)
input int             TakeProfit          = 737;       // Take Profit (in pips)
input int             PointOrderStep      = 33;        // Point order step (in pips)
input int             MinimalProfit       = 35;        // Minimal profit for close Average orders (in pips)
//---
input ENUM_TIMEFRAMES TF                  = PERIOD_H1; // Тайм Фрейм для расчета входа
input ENUM_TIMEFRAMES TF_ATR              = PERIOD_H1; // Тайм Фрейм для ATR
input int             Per_MA              = 14;
input int             LevelSell           = 22;
input int             LevelBuy            = 62;
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage 
//---
double SellBuff;
double BuyBuff;
double ShortSig;
double LongSig;
double op,lt,tp,slv;
int    tk,b,s;
int    iB=1;
double BuyPriceMax=0,BuyPriceMin=0,BuyPriceMaxLot=0,BuyPriceMinLot=0,
       SelPriceMin=0,SelPriceMax=0,SelPriceMinLot=0,SelPriceMaxLot=0;
double FullBU,BuyBU,SelBU;
//************************************************************************************************/
int OnInit()
{
     slv = StopLoss*Point;
     Comment("");
  return(INIT_SUCCEEDED);
}
//**********************************************************************************************/
void OnTick()
{//------------------- Сначала изучаем текущую обстановку по ордерам ---------------------------/
   BuyPriceMax=0;BuyPriceMin=0;BuyPriceMaxLot=0;BuyPriceMinLot=0;
   SelPriceMin=0;SelPriceMax=0;SelPriceMinLot=0;SelPriceMaxLot=0;

   int
   BuyPriceMaxTic=0,BuyPriceMinTic=0,SelPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0;

   op=0;lt=0;tp=0;
   FullBU=0;
   tk=0;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())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum += lt;
                  WeighBuy   += lt*op;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax    = op;
                     BuyPriceMaxLot = lt;
                     BuyPriceMaxTic = tk;
                     }
                  if(op<BuyPriceMin || BuyPriceMin==0)
                     {
                     BuyPriceMin    = op;
                     BuyPriceMinLot = lt;
                     BuyPriceMinTic = tk;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum += lt;
                  WeighSell  += lt*op;
                  
                  if(op>SelPriceMax || SelPriceMax==0)
                     {
                     SelPriceMax    = op;
                     SelPriceMaxLot = lt;
                     SelPriceMaxTic = tk;
                     }
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin    = op;
                     SelPriceMinLot = lt;
                     SelPriceMinTic = tk;
                     }
                  }
               }
            //---
            if(b>CloseLim && CloseLim!=0)    // Если ордеров на покупку больше заданного (усредняющие ордера)
              if(OrderClose (BuyPriceMaxTic, BuyPriceMaxLot, Bid , Slippage, clrBlue)) // Закрываем дальний.
                return;                                                                // опять пересчитываем текучку.
                
            if(s>CloseLim && CloseLim!=0)
              if(OrderClose (SelPriceMinTic, SelPriceMinLot, Ask , Slippage, clrRed)) 
                return;
            //---
            if(Metod!=Normal)  
               if ((BuyLotsSum - SelLotsSum) != 0) 
                  FullBU = (WeighBuy - WeighSell)/(BuyLotsSum - SelLotsSum);// Определяем цену общего БУ для всех ордеров
//***************** Определение БУ+MinTP для крайник ордеров одного направления ***************************//
   double   AwerageBuyPrice=0,AwerageSelPrice=0;
   if(b>=CountAverge) AwerageBuyPrice=NormalizeDouble
         ((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*BuyPriceMinLot)/(BuyPriceMaxLot+BuyPriceMinLot)+MinimalProfit*Point(),Digits());
   if(s>=CountAverge) AwerageSelPrice=NormalizeDouble
         ((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)/(SelPriceMaxLot+SelPriceMinLot)-MinimalProfit*Point(),Digits());
//*************************************************************//
   double BuyLot=0,SelLot=0;
   
   if(Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
         
      if(SelPriceMaxLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(!Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
         
      if(SelPriceMaxLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(Metod==ShamanSmart)
      {   
      if(SelPriceMaxLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=SelLotsSum*2;
         
      if(BuyPriceMinLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=BuyLotsSum*2;
      }
//*************************************************************//

   if(BuyLot>MaximalLots)      BuyLot=MaximalLots;
   if(SelLot>MaximalLots)      SelLot=MaximalLots;
   if(!CheckVolumeValue(BuyLot) || !CheckVolumeValue(SelLot))
      return;   
//*************************************************************//
   if(Metod==Normal)
      {
      if(Signal()==OP_BUY)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
      if(Signal()==OP_SELL)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
      }
avatar

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

  • 3 мая 2024, 20:45
+
0
Вторая часть Shaman V 1.4. Склейте.


   if(Metod==Shaman || Metod==ShamanSmart)
     {
      if(Signal()==OP_BUY && Ask<FullBU)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
   
      if(Signal()==OP_SELL && Bid>FullBU)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
     }
//****************  Усреднение ордеров **********************************//
   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());
               tp=NormalizeDouble(OrderTakeProfit(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();

               if(OrderType()==OP_BUY)
                  { 
                  if(b>=1 && tp==0) // Если есть ордера на покупку и их ТР=0, то выставляем ему ТР.
                                    // Откуда ТР=0? Это новый открытый, а также с обнуленным ТР. Читай дальше, когда обнуляем.
                     if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Ask+TakeProfit*Point(),Digits()),0,clrNONE))
                        Print("OrderModify error #",GetLastError());
   
                  if(b>=CountAverge)// Если ордеров на покупку не менее, чем мы определили для сокращения
                     {              // то пытаемся сократить крайние из них.
                     if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                        if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                           if(!OrderModify(tk,op,OrderStopLoss(),AwerageBuyPrice,0,clrNONE))// Dыставляем им ТР в общий БУ+.
                              Print("OrderModify error #",GetLastError());
   
                     if(tk!=BuyPriceMaxTic && tk!=BuyPriceMinTic && tp<op+(TakeProfit-5)*Point())// Если появился очередной усредняющий ордер, то 
                        if(!OrderModify(tk,op,0,NormalizeDouble(op+TakeProfit*Point(),Digits),0,clrNONE))             // предыдущему (уже не крайнему) обнуляем ТР.
                           Print("OrderModify error #",GetLastError());   // затем в строках 220-223 вернем ему "родной" ТР. 
                     }
                     
                  if(Revers && Bid<=op-slv)
                     if(OrderSend(Symbol(),OP_SELL,lt,NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
                        Print("OrderSend error #",GetLastError());
                  }
               //---                   
               if(OrderType()==OP_SELL)
                  { 
                  if(s>=1 && tp==0)
                     if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Bid-TakeProfit*Point(),Digits()),0,clrNONE))
                        Print("OrderModify error #",GetLastError());
                        
                  if(s>=CountAverge)
                     {
                     if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                        if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                           if(!OrderModify(tk,op,OrderStopLoss(),AwerageSelPrice,0,clrNONE))
                              Print("OrderModify error #",GetLastError());
   
                     if(tk!=SelPriceMaxTic && tk!=SelPriceMinTic && tp>op-(TakeProfit-5)*Point())
                        if(!OrderModify(tk,op,0,NormalizeDouble(op-TakeProfit*Point(),Digits()),0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                     if(Revers>0 && Ask>=op+slv)
                        if(OrderSend(Symbol(),OP_BUY,lt,NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
                           Print("OrderSend error #",GetLastError());
                     }
                  }
               }
}
//************************************************************************************************/
bool CheckVolumeValue(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);
}
//************************************************************************************************/
/*СИГНАЛ*/
//------------------------------------------------------------------	
int Signal()                   // Создаем функцию получения сигнала на указанном ТФ и баре
{
        double current_openprice = iOpen (Symbol(),TF , iB);
        double Mashka =iMA(NULL,0,Per_MA,0,0,4,iB) ;
        double Atrium=0;
        
          Atrium  = 0.2 * iATR(NULL,TF_ATR,Per_MA,iB);
         
          if(Bid>=current_openprice)                                               
            {
            SellBuff = (58000000.0 * (Bid  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Low[iB]   - Mashka) * Atrium);
            }
          if(Bid<current_openprice)
            {
            SellBuff = (58000000.0 * (High[iB]  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Bid   - Mashka) * Atrium);
            }
          if (SellBuff >  LevelSell) 
            return OP_SELL;
          
          if (BuyBuff < -LevelBuy) 
            return OP_BUY;
	return -1;                   // Иначе нет сигнала. Возвращаем в int Signai () -1 (никаких сигналов)
}
//************************************************************************************************
double GetProfit()
{  
   double Profit=0;
     
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              Profit += OrderProfit() + OrderCommission() + OrderSwap();
   return (Profit);
}
//************************************************************************************************
bool CloseAll()
{ 
   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)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
bool ClosePlus()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol() && OrderProfit()>0)
              {
              if(OrderType()==OP_BUY)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
bool CloseMinus()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol() && OrderProfit()<=0)
              {
              if(OrderType()==OP_BUY)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  {
                  Sleep(500);
                  i=i+1;//??????????????
                  }
              }
   return true;
}
//************************************************************************************************
avatar

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

  • 3 мая 2024, 20:48
+
0
Андрей приветствую. Пробовали к советнику трал прикрутить, и на сколько если «да» это жизнеспособно и увеличивает мат ожидание?
avatar

  4  Jimirami Сообщений: 44

  • 19 мая 2024, 19:22
+
0
Что тралить то? Разве что прибыль.
avatar

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

  • 19 мая 2024, 21:30
+
0
Совершенно верно — прибыль. Но скорее трал нужен для перехода в безубыток или для наименьшей цены усредненного лота, и если рынок идет в нашу сторону можно забирать большие движения. Я бы хотел протестировать это. Если не трудно можете помочь? если не хочется засорять эту ветку, скиньте пожалуйста в Личные сообщения, я тут удалю комментарии.
Редактирован: 20 мая 2024, 06:43
avatar

  4  Jimirami Сообщений: 44

  • 20 мая 2024, 06:40
+
0
Уважаемый Jimirami, не совсем понятна ваша идея. Дело не в засоре ветки. Наоборот. Всегда рад. Тут идея советника в другом: мы открываем сделки в сторону БУ. Таким образом подтягиваем общий БУ к текущей цене. Это главная идея. Если Магомед не может… Я бы больше озаботился вопросом, каким образом и по какой причине мы открываем новые сделки. Вы правы в одном. Когда-то же надо фиксировать. прибыль. Блин, времени катастрофически… Попробую на днях написать трал эквити. Может посмотрите в своих загашниках. У меня готового нет. Прикручу ваш. Идея трала: Задаем убыток в деньгах, при котором выключаем свет. Потом эту линию при росте эквити, подтягиваем к линии возрастающего эквити. Наступит такой момент, когда советник закроется при откате эквити к линии СТОР. Возможно понадобится защита от большого количества ордеров. Чтоб не съели свободную маржу. Маржинкол никому не нужен.
avatar

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

  • 23 мая 2024, 18:25
+
0
После того как написал тебе Андрей сообщение, через пару дней пришло на ум все тоже что и вам «Трал-трал» зачем? Правильно сократить убытки и уберечься от маржинкола надо. но как? Ограничить советник по проценту от эквити и количеству сделок на мартине — Всё другого ничего не нужно. Нечего тут тралить — подумал. И читаю твое сообщение — пишешь тоже самое, о чем я подумал. Так что я двумя руками за твою идею. % от эквити и ограничение максимального количество открытых позиций. ( и возможность ставить автоматический расчет лота от % депо отключаемый)
Редактирован: 23 мая 2024, 21:05
avatar

  4  Jimirami Сообщений: 44

  • 23 мая 2024, 21:04
+
0
Что-то мои потуги по феншую не привели к нужному результату. Видимо функции типа AccountEquity() в тестере не работают. Может кто-нибудь глянет?

<code>
//---     
if (PercentFreeEquity>0)                                 // Трал эквити разрешен.
   {                
   Equity   = AccountEquity();                           // Текущий эквити.
   if (StopEquity==0)                                    // Начало отсчета.
      StopEquity = Equity;                               // Запоминаем стартовый эквити.
                     
   double lev_eq = Equity - Equity/100*PercentFreeEquity;// Текущий уровень трала эквити.
                  
   if (StopEquity < lev_eq)                              // Если уровень стоп-эквити подрос, 
      StopEquity  = lev_eq;                              // подтягиваем стоп-эквити до
                                                         // уровня срабатывания.
   if (StopEquity >= lev_eq && GetProfit()>0)
      {
      CloseAll();
      StopEquity = 0;
      }
   }
   //---
</code>


Т.е. лажа. Пока другие доработки.

Изменил условия открытия сделок. Добавил свой индикатор. Можете поэкспериментировать со своими. Добавил новую функцию высокочастотной торговли. Можно хорошо зарабатывать на возврате спреда и (или) комиссии.
Редактирован: 25 мая 2024, 20:38
avatar

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

  • 25 мая 2024, 19:25
+
0
Вот смиллиона трал эквити
//+------------------------------------------------------------------+
//|                               Copyright © 2015, Vladimir Hlystov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, http://cmillion.ru"
#property link      "cmillion@narod.ru"
#property version   "1.00"
#property strict

extern double  Total_Profit_Start   = 5000;  //Сумма в USD от которой стартовать трал по Профиту
extern double  Profit_Percent       = 1;     //% Процент профита для старта трала
extern double  Profit_Rollback      = 0.5;   //% Процент отката для закрытия всех ордеров

double EquityStart=0;
bool Trall=false;
int slippage=1000;
//-------------------------------------------------------------------- 
int init() 
{ 
   double AE = AccountEquity();
   EquityStart=AE+AE/100*Profit_Percent;
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   if (!IsTradeAllowed()) return(0);

   double AB = AccountBalance();
   double AE = AccountEquity();

   DrawLABEL("Balance",1,5,20,Lime,StringConcatenate("Balance ",DoubleToStr(AB,2)));
   DrawLABEL("Equity" ,1,5,40,Lime,StringConcatenate("Equity ",DoubleToStr(AE,2)));

   if (OrdersTotal()==0) {Trall=false;EquityStart=AE+AE/100*Profit_Percent;}
   if (!Trall)
   {  
      DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Equity Start Trall ",DoubleToStr(MathMax(EquityStart,Total_Profit_Start),2)));
      if (AE>=EquityStart && AE>=Total_Profit_Start) //запуск тралла по эквити
      {  
         EquityStart=AE+AE/100*Profit_Percent;
         Alert("Запуск трейлинга Equity, Equity = "+DoubleToStr(AE,2));
         Trall=true;
      }
   }
   if (Trall)
   {  
      if (EquityStart<AE+AE/100*Profit_Percent) EquityStart=AE+AE/100*Profit_Percent;
      DrawLABEL("Equity Start",1,5,0,Red,StringConcatenate("Трал Equity закрытие при ",DoubleToStr(EquityStart-EquityStart/100*Profit_Rollback,2)));
      if (AE<=EquityStart-EquityStart/100*Profit_Rollback)
      {  
         CloseAll();
         Trall=false;
         AE=AccountEquity();
         EquityStart=AE+AE/100*Profit_Percent;
      }
      return(0);
   }
return(0);
}
//------------------------------------------------------------------
int deinit()
{
   if (!IsTesting()) 
   {
      ObjectsDeleteAll(0);
   }
   return(0);
}
//-------------------------------------------------------------------
void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
{
   if (ObjectFind(name)!=-1) ObjectDelete(name);
   ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
   ObjectSet(name, OBJPROP_CORNER, CORNER);
   ObjectSet(name, OBJPROP_XDISTANCE, X);
   ObjectSet(name, OBJPROP_YDISTANCE, Y);
   ObjectSetText(name,Name,10,"Arial",clr);
}
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//------------------------------------------------------------------
double CloseAll()
{
   bool error=true;
   int OMN,nn,OT,Ticket,j;
   double loss=0;
   while(true)
   {
      for (j = OrdersTotal()-1; j >= 0; j--)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            OT = OrderType();
            OMN=OrderMagicNumber();
            Ticket = OrderTicket();
            if (OT>1) error=OrderDelete(Ticket);
            if (OT==OP_BUY) 
            {
               error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Blue);
               if (error) loss+=OrderProfit();
            }
            if (OT==OP_SELL) 
            {
               error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Red);
               if (error) loss+=OrderProfit();
            }
         }
      }
      int n=0;
      for (j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            OT = OrderType();
            n++;
         }
      }
      if (n==0) break;
      nn++;
      if (nn>10) 
      {
         Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
         return(loss);
      }
      Sleep(1000);
      RefreshRates();
   }
   return(loss);
}
//--------------------------------------------------------------------
avatar

  15  OSS5 Сообщений: 168

  • 26 мая 2024, 03:48
+
0
Индюк KAE_KVN_U_Dif3_MT4 www.opentraders.ru/downloads/3845/ закинуть в папку индикаторов.

Советник, конечно же, не для продаж. Есть над чем работать. Но интересен. Своими выкрутасами.
Впрочем, крайний вариант. Часть первая.

//+------------------------------------------------------------------+
//|                                           KAE Shaman NEW v.2.mq4 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
#define INDUK1 "KVN_KAE_U_Dif3"
//---
enum ENUM_Metod
  {
   Normal       = 0,  
   Shaman       = 1,  
   ShamanSmart  = 2     
  };
input ENUM_Metod      Metod               = Shaman;    // Metod Open - тип работы советника, метод открытия ордеров.
input bool            Agressor            = false;     // Agressor - функция влияет только на расчет ордеров и работает всегда.
input bool            RebateOn            = false;     // Программа для возврата Спреда.
input int             CloseLim            = 0;         // Close Limit - функция оставляет к-во ордеров в каждом направлении.
input int             CountAverage        = 2;         // Count Average - к-во ордеров при котором начинается усреднение.
//---      
input double          Risk                = 0.5;       // Авто лот, 0- выкл.
input double          StartLot            = 0.01;      // Start lot
input double          CoeffLots           = 1.1;       // Coeff. Lots - коэффициент мартингейла
input double          MaximalLots         = 2.56;      // Maximal Lot 
//--
input int             TakeProfit          = 273;       // Take Profit (in pips)
input int             PointOrderStep      = 63;        // Point order step (in pips)
input int             MinimalProfit       = 37;        // Minimal profit for close Average orders (in pips)
//---
input int             PeriodLR            = 7;        // Период LR
input int             PerMADelta          = 3;        // Период сглаживания
input bool            SignalOnCurent      = false;
//---      
input double          LevelStopLoss       = 0;
input double          LevelStopProfit     = 0;
input int             LevelBU             = 0;
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double SellBuff;
double BuyBuff;
double ShortSig;
double LongSig;
double op,lt,tp;
int    tk,b,s;
int    iB=0;
double BuyPriceMax=0,BuyPriceMin=0,BuyPriceMaxLot=0,BuyPriceMinLot=0,
       SelPriceMin=0,SelPriceMax=0,SelPriceMinLot=0,SelPriceMaxLot=0;
double FullBU,BuyBU,SelBU,StartLots;
double StepLot;
double StopEquity=0, OldEquity=0, Equity;
double OldFreeMarg=0, FreeMarg;
double OldLasso=0;
int    BuyPriceMaxTic,BuyPriceMinTic,SelPriceMaxTic,SelPriceMinTic,CountHist=0;
double BuyLotsSum,SelLotsSum,WeighBuy,WeighSell;
//************************************************************************************************/
int OnInit()
{
      string Symb    = Symbol();                                // Финансовый инструм.
      double One_Lot = MarketInfo(Symb,MODE_MARGINREQUIRED);    // Стоим. 1 лота
      double LotVal  = MarketInfo(Symb, MODE_TICKVALUE);        //стоимость 1 пункта для 1 лота
      double margin  = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
             StepLot = MarketInfo(Symb, MODE_LOTSTEP);          // шаг изменения лота
     Comment("");
  return(INIT_SUCCEEDED);
}
//************************************************************************************************/
void OnTick()
{
   if (CountHist!=OrdersTotal())                // Если изменилось количество открытых ордеров.
      {
      CountHist=OrdersTotal();
      
      BuyPriceMax=0;BuyPriceMin=0;BuyPriceMaxLot=0;BuyPriceMinLot=0;
      SelPriceMin=0;SelPriceMax=0;SelPriceMinLot=0;SelPriceMaxLot=0;
      BuyPriceMaxTic=0;BuyPriceMinTic=0;SelPriceMaxTic=0;SelPriceMinTic=0;
      BuyLotsSum=0;SelLotsSum=0;WeighBuy=0;WeighSell=0;
      op=0;lt=0;tp=0;
      BuyBU=0;SelBU=0;FullBU=0;
      tk=0;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())
                 {
                  op=NormalizeDouble(OrderOpenPrice(),Digits());
                  lt=NormalizeDouble(OrderLots(),2);
                  tk=OrderTicket();
                  if(OrderType()==OP_BUY)
                    {
                     b++;
                     BuyLotsSum += lt;
                     WeighBuy   += lt*op;
                     
                     if(op>BuyPriceMax || BuyPriceMax==0)
                       {
                        BuyPriceMax    = op;
                        BuyPriceMaxLot = lt;
                        BuyPriceMaxTic = tk;
                       }
                     if(op<BuyPriceMin || BuyPriceMin==0)
                       {
                        BuyPriceMin    = op;
                        BuyPriceMinLot = lt;
                        BuyPriceMinTic = tk;
                       }
                    }
                  // ===
                  if(OrderType()==OP_SELL)
                    {
                     s++;
                     SelLotsSum += lt;
                     WeighSell  += lt*op;
                     
                     if(op>SelPriceMax || SelPriceMax==0)
                       {
                        SelPriceMax    = op;
                        SelPriceMaxLot = lt;
                        SelPriceMaxTic = tk;
                       }
                     if(op<SelPriceMin || SelPriceMin==0)
                       {
                        SelPriceMin    = op;
                        SelPriceMinLot = lt;
                        SelPriceMinTic = tk;
                       }
                    }
                 }
      }              
      //---------------------------------------------------------------------------------------------
              if(b>CloseLim && CloseLim!=0)
                if(OrderClose (BuyPriceMaxTic, BuyPriceMaxLot, Bid , Slippage, clrBlue)) 
                  return;
                
              if(s>CloseLim && CloseLim!=0)
                if(OrderClose (SelPriceMinTic, SelPriceMinLot, Ask , Slippage, clrRed)) 
                  return;
              //---
              if (BuyLotsSum - SelLotsSum != 0) 
                 FullBU = (WeighBuy - WeighSell)/(BuyLotsSum - SelLotsSum);
               //---    
              if (RebateOn)                                               
                 {                
                 if (GetProfit()>0)
                    CloseAll();
                 }
//*************************************************************//
   double   AwerageBuyPrice=0,AwerageSelPrice=0;
   if(b>=CountAverage) AwerageBuyPrice=NormalizeDouble
         ((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*BuyPriceMinLot)/(BuyPriceMaxLot+BuyPriceMinLot)+MinimalProfit*Point(),Digits());
   if(s>=CountAverage) AwerageSelPrice=NormalizeDouble
         ((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)/(SelPriceMaxLot+SelPriceMinLot)-MinimalProfit*Point(),Digits());
//*************************************************************//
   StartLots=StartLot;
   
   if (Risk>0) 
      StartLots=AccountFreeMargin()*Risk/100/MarketInfo(Symbol(), MODE_MARGINREQUIRED); 
                    
   double BuyLot=0,SelLot=0;
   
   if(Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) BuyLot=StartLots; else BuyLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
      if(SelPriceMaxLot==0) SelLot=StartLots; else SelLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(!Agressor && (Metod==Normal || Metod==Shaman))
      {   
      if(BuyPriceMinLot==0) SelLot=StartLots; else SelLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
      if(SelPriceMaxLot==0) BuyLot=StartLots; else BuyLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   if(Metod==ShamanSmart)
      {   
      if(SelPriceMaxLot==0) BuyLot=StartLots; else BuyLot=SelLotsSum*2;
      if(BuyPriceMinLot==0) SelLot=StartLots; else SelLot=BuyLotsSum*2;
      }
   BuyLot=NormalizeDouble(BuyLot,2);
   SelLot=NormalizeDouble(SelLot,2);
//-------------------------------------------------------------//
   if(BuyLot>MaximalLots)      BuyLot=MaximalLots;
   if(SelLot>MaximalLots)      SelLot=MaximalLots;
   if(!ValidLot(BuyLot) || !ValidLot(SelLot))
      return;   
//*************************************************************//
   if(Metod==Normal)
     {
      if(Signal()==OP_BUY)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,BuyLot,NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
   
      if(Signal()==OP_SELL)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,SelLot,NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
     }
   //---   

avatar

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

  • 25 мая 2024, 20:35
+
0
Вторая склейка
//---   
   if(Metod==Shaman || Metod==ShamanSmart)
     {
      if(Signal()==OP_BUY && Ask<FullBU && Ask<=BuyPriceMin-PointOrderStep*Point())
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
   
      if(Signal()==OP_SELL && Bid>FullBU && Bid>=SelPriceMax+PointOrderStep*Point())
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
     }
//*************************************************************//
   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());
               tp=NormalizeDouble(OrderTakeProfit(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();

               if(OrderType()==OP_BUY && b==1 && tp==0)
                  if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Ask+TakeProfit*Point(),Digits()),0,clrNONE))
                     Print("OrderModify error #",GetLastError());

               if(OrderType()==OP_BUY && b>=CountAverage)
                 {
                  if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                     if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                        if(!OrderModify(tk,op,OrderStopLoss(),AwerageBuyPrice,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                  if(tk!=BuyPriceMaxTic && tk!=BuyPriceMinTic && tp!=0)
                     if(!OrderModify(tk,op,0,0,0,clrNONE))
                        Print("OrderModify error #",GetLastError());
                 }
                 
               if(OrderType()==OP_SELL && s==1 && tp==0)
                  if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Bid-TakeProfit*Point(),Digits()),0,clrNONE))
                     Print("OrderModify error #",GetLastError());

               if(OrderType()==OP_SELL && s>=CountAverage)
                 {
                  if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                     if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                        if(!OrderModify(tk,op,OrderStopLoss(),AwerageSelPrice,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                  if(tk!=SelPriceMaxTic && tk!=SelPriceMinTic && tp!=0)
                     if(!OrderModify(tk,op,0,0,0,clrNONE))
                        Print("OrderModify error #",GetLastError());
                 }
              }
              //---
              double Prof = GetProfit();
              
              if((Prof>=LevelStopProfit && LevelStopProfit!=0) || (-Prof>=LevelStopLoss && LevelStopLoss!=0))
                CloseAll();
                
              if(LevelBU>0) 
                 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);
}
//************************************************************************************************/
/*СИГНАЛ*/
//------------------------------------------------------------------	
int Signal()                   // Создаем функцию получения сигнала на указанном ТФ и баре
{
      iB=1; if(SignalOnCurent) iB=0;
      
      double KVN_0=iCustom(NULL,0,INDUK1,PeriodLR, PerMADelta, 0, iB);
      double KVN_1=iCustom(NULL,0,INDUK1,PeriodLR, PerMADelta, 0, iB+1);
      
      if (KVN_1>=0 &&  KVN_0<=0) 
         return OP_SELL;
       
      if (KVN_1<=0 &&  KVN_0>=0) 
         return OP_BUY;
	return -1;                   // Иначе нет сигнала. Возвращаем в int Signai () -1 (никаких сигналов)
}
//************************************************************************************************
double GetProfit()
{  
   double Profit=0;
     
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              Profit += OrderProfit() + OrderCommission() + OrderSwap();
   return (Profit);
}
//************************************************************************************************
bool CloseAll()
{ 
   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)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Sleep(500);
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Sleep(500);
              }
   return true;
}
//************************************************************************************************
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 = 0;
                      tp = OrderTakeProfit();
                      op = OrderOpenPrice();
                      lt = OrderLots();
              double _lt = NormalizeDouble(lt/2,2);
                     
                     
              if(!ValidLot(_lt)) continue;
                           
              if(OrderType()==OP_BUY && Bid >= op+LevelBU*Point)
                {
                sl = NBU(OP_BUY,op);
                if(sl == OrderStopLoss())continue;
                 
                if(OrderModify(OrderTicket(),op,sl,0,0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Bid,Slippage))
                    Sleep(500);
                }
              //---
              if(OrderType()==OP_SELL &&  Ask <= op-LevelBU*Point)
                {
                sl = NBU(OP_SELL,op);
                if(sl == OrderStopLoss())continue;
                 
                if(OrderModify(OrderTicket(),op,sl,0,0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Ask,Slippage))
                    Sleep(500);
                }
              }
   return true;
}
//************************************************************************************************
double NBU(int dir, double oop) // Нормализация цены стоплоса
{
   double BU = LevelBU; 

	if (BU==0) return 0;
	
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	double pr=NP((dir==OP_BUY)?Bid:Ask);
	
	if (dir==OP_BUY) 
	   { 
	   double _sl=oop-BU*Point;
	   return NP(MathMin(_sl, pr-StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   double _sl=oop+BU*Point;
	   return NP(MathMax(_sl, pr+StopLvl)); 
	   }
	return 0;
}
//************************************************************************************************
double NP(double d) 
{
       double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); 
       
       if (TickSize==0) 
         TickSize=1; 
    return ND(MathRound(d/TickSize)*TickSize); 
}
//************************************************************************************************
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//************************************************************************************************
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

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

  • 25 мая 2024, 20:36
+
0
День добрый!
Во вложении нет индикатора «KVN_KAE_U_Dif3», есть эксперт «ShamanNew v_2».

поэтому при тестировании в логах

Скиньте еще раз, но уже индикатор. Спасибо.
avatar

  15  OSS5 Сообщений: 168

  • 26 мая 2024, 03:44
+
0
День добрый!
Пардон. Перезалил.
avatar

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

  • 26 мая 2024, 07:04
+
0
Что-то не фонтанирует. Добавил еще индюка на выбор. Трал Эквити от CMILION. Пробуйте.

www.opentraders.ru/downloads/3846/
avatar

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

  • 27 мая 2024, 11:50
+
0
Так прикипел к старому индикатору и понимал его работу на протяжении множества тестов, что от этого прям отторжение. Вернуть бы старый обычный алгоритм ордеров шамана с добавлением ограничителей которые ты Андрей добавил. (Хотя видимо вы вместе его делали упорным трудом). На старом индикаторе было ВСЁ!- красиво. Не хватало только ограничение открытия ордеров как в нынешней версии. Если ты откатишь старый индикатор — Будет красота, и классический советник Шамана заиграет новыми гибкими переменными настройками и не изменится до неузнаваемости
avatar

  4  Jimirami Сообщений: 44

  • 27 мая 2024, 20:14
+
0
Очень странно когда советник торгует только продажи и выставляет ордера в таком алгоритме частыми ордерами. Понимаю, что кто-то оценит. Может еще я не разобрался, но пока с большим трудом разбираюсь и принимаю его, с ностальгией вспоминая о старом добром усреднении по методу Шамана. Ища возможность все таки добавить в него какой нибудь риск-менеджмент
avatar

  4  Jimirami Сообщений: 44

  • 27 мая 2024, 20:20
+
0
А это за какой советник речь?..
avatar

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

  • 27 мая 2024, 20:34
+
0
Этот метод высокочастотной торговли мой. Идея простая.
Ордеров множество, прибыль так себе, а основной заработок на Ribаte.
Без напряга за месяц >15 лотов. При лоте 0.01. Прибыль не большая — процентов десять при просадке до 20%. А основной заработок на Ribаte. Если не лень, посчитайте 50% только спреда. Сумма прелюбопытнейшая.

Кстати на эту тему открыл топик. Добро пожаловать.

kvashnin007.opentraders.ru/131192.html
Редактирован: 27 мая 2024, 20:44
avatar

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

  • 27 мая 2024, 20:42
+
0
Сам хренею. Думал ошибка в коде. Не нашел. В некоторых режимах торгует туды-сюды. А чаше — продажи. Менял очередность в коде. Не влияет. Такое чувство, что цена никак не может догнать безубыток.
avatar

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

  • 27 мая 2024, 23:57
+
0
Jimirami, я не работал над советником. Просто посмотрев работу того, что Шаман дал. и заметил точки улучшения. В настоящий момент даже то, что получил, не работает. Даже толком не помню, что хотелось изменить. Писал Сергею, а он не заинтересовался. На этом и порешили. Помню, что вероятности событий распределены были не верно. Это мы считаем, что фифти -фифти. А по факту не более 33%. Надо было менять ММ.

А у тебя что? мой вариант работает?
avatar

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

  • 27 мая 2024, 20:33
+
0
Я 2 недели а то и больше тестил советник Shaman V 1.4 и был удовлетворен им. Много разнообразных сетов для разных депо (чаще больших). Решил поставить на цент с ВПС, но прежде прикрутить риск-менеджмент. После 3го уровня, попрошу программистов сайта этим заняться. Надо подумать о правильном тех задании. Что же советника Шаман 2 и шаман 3, отнесся холодно (возможно пока не сильно углубился) еще разбираюсь. Мысленно ловлю на мысли себя, что это как будто совсем другой советник получился и разбираться уже в нем не хочется т.к база другая и к нему нужен другой подход, а это нагрузка на мозг, а его еще попробуй заставить помнить старое и учить новое и жонглировать этим одновременно. Думаю вернусь к версии 2 и 3 когда полностью разберусь с Shaman V 1.4. А твое вдохновение уважаю. Ты молодец.
Редактирован: 27 мая 2024, 21:24
avatar

  4  Jimirami Сообщений: 44

  • 27 мая 2024, 21:20
+
0
Если что?, могу быть поручителем.
avatar

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

  • 28 мая 2024, 09:25
+
0
Просьба стать поручителем в другом топике zakaz.opentraders.ru/131220.html#comment172900
avatar

  4  Jimirami Сообщений: 44

  • 1 июня 2024, 17:58
+
0
Для поддержания темы группы поделюсь несколькими фотографиями прогонов, что получается и не получается у советника.
avatar

  4  Jimirami Сообщений: 44

  • 1 июня 2024, 23:21
+
0




Тест с 2000-2024г без усреднения
Редактирован: 1 июня 2024, 23:24
avatar

  4  Jimirami Сообщений: 44

  • 1 июня 2024, 23:24
+
0




тест 2000-2024 добавлено легкое усреднение
avatar

  4  Jimirami Сообщений: 44

  • 1 июня 2024, 23:26
+
0
Советник открывает много усредняющих ордеров как по мне, при неблагоприятных условиях дает большую нагрузку на депо, что затрудняет работать ему с небольшими депозитами. Кто тестил советник может поделится здравыми мыслями о том, что можно подкрутить и добавить в советник? Напишу ТЗ программистам ресурса, чтобы подправили как надо.
avatar

  4  Jimirami Сообщений: 44

  • 1 июня 2024, 23:41
+
0
Цена движется по пиле. Две шаги налево(вверх-вниз), две шаги налево. Идея усреднения в том, что: открывая усредняющий ордер да и еще с повышенным лотом цена БУ для этих двух ордеров образуется между этими двумя ордерами. Чем больше усредняющий ордер в отношении к основному, тем ближе БУ подтягивается к усредняющему ордеру и, при небольшом откате (пила) цена дошла до общего БУ. И еще чуть дальше (MinTP). В этот момент мы сокращаем (закрываем) эти два ордера с минимальным профитом. Здесь нюансов много, но это также может стать основной статьей заработка. Все зависит от рынка и настроек.
avatar

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

  • 4 июня 2024, 15:05
+
0
Этот вари ант далеко не первый и не последний. Их было тьма.
СчаЗ посмотрел: 11 вариантов. Это все докрутки, какие придумал.

Число усредняющих ордеров зависят от шага. Лотность от CoeffLots. Усредняющие ордера по возможности сокращаются в плюс MinTP. Благодаря Awerage. Но здесь нюанс. Чтобы «качественнее» сокращались надо CoeffLots побольше, а MinimalProfit поменьше. Шаг лучше по индюку. Опять же, это все, с другой стороны, повышает нагрузку и просадку. Здесь нужна подгонка под рынок. А это само по себе не надежно.

Ввел CloseLim, которая ограничивает количество открытых сделок в каждом направлении. Теряя в депозите, но отыгрывая в свободных средствах. В итого понижает нагрузку и просадку.

Режим Agressor для безбашенных. Лучше отключать.

Режим Шаман открывает ордера только в направлении общего БУ. Надо, думаю, в БУ добавить MinTP.
Ну а нормальный режим — простой сеточник, но умный.
avatar

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

  • 2 июня 2024, 00:35
+
0
Кажется первый вариант.
Твикс. Две совы в одной.


#property strict
//---
enum ENUM_Metod
  {
   Shaman    = 0,  
   Normal    = 1     
  };
input ENUM_Metod      Metod               = Shaman;   // Metod - тип работы советника, метод открытия ордеров.
input bool            Agressor            = false;    // Agressor - функция влияет только на расчет ордеров и работает всегда.
input int             CloseLim            = 0;        // Close Limit - функция оставляет к-во ордеров в каждом направлении.
//---      
input double          LevelStopLoss       = 0;
input double          LevelStopProfit     = 0;
//---      
input int             TakeProfit          = 273;      // Take Profit (in pips)
input double          StartLots           = 0.01;     // Start lot
input double          CoeffLots           = 1.1;     
input double          MaximalLots         = 2.56;     // Maximal Lot 
input int             PointOrderStep      = 63;       // Point order step (in pips)
input int             MinimalProfit       = 37;       // Minimal profit for close Average orders (in pips)
input int             MagicNumber         = 227;      // Magic Number 
input int             Slippage            = 30;       // Slippage (in pips)
//---
input ENUM_TIMEFRAMES TF                  = PERIOD_M5; // Тайм Фрейм для ATR
input ENUM_TIMEFRAMES TF_ATR              = PERIOD_H1; // Тайм Фрейм для расчета входа
input int             Per_MA              = 9;
input int             LevelSell           = 55;
input int             LevelBuy            = 88;
//---
double SellBuff;
double BuyBuff;
double ShortSig;
double LongSig;
double op,lt,tp;
int    tk,b,s;
int    iB=1;
double LotStopSell,LotStopBuy;
double Trigger_S=0, Trigger_B=0;
double BuyPriceMax=0,BuyPriceMin=0,BuyPriceMaxLot=0,BuyPriceMinLot=0,
       SelPriceMin=0,SelPriceMax=0,SelPriceMinLot=0,SelPriceMaxLot=0;
double FullBU;
//************************************************************************************************/
int OnInit()
  {
  Comment("");
  return(INIT_SUCCEEDED);
  }
//************************************************************************************************/
void OnTick()
  {
   BuyPriceMax=0;BuyPriceMin=0;BuyPriceMaxLot=0;BuyPriceMinLot=0;
   SelPriceMin=0;SelPriceMax=0;SelPriceMinLot=0;SelPriceMaxLot=0;

   int
   BuyPriceMaxTic=0,BuyPriceMinTic=0,SelPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0;

   op=0;lt=0;tp=0;

   tk=0;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())
              {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               if(OrderType()==OP_BUY)
                 {
                  b++;
                  BuyLotsSum += lt;
                  WeighBuy   += lt*op;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                    {
                     BuyPriceMax    = op;
                     BuyPriceMaxLot = lt;
                     BuyPriceMaxTic = tk;
                    }
                  if(op<BuyPriceMin || BuyPriceMin==0)
                    {
                     BuyPriceMin    = op;
                     BuyPriceMinLot = lt;
                     BuyPriceMinTic = tk;
                    }
                 }
               // ===
               if(OrderType()==OP_SELL)
                 {
                  s++;
                  SelLotsSum += lt;
                  WeighSell  += lt*op;
                  
                  if(op>SelPriceMax || SelPriceMax==0)
                    {
                     SelPriceMax    = op;
                     SelPriceMaxLot = lt;
                     SelPriceMaxTic = tk;
                    }
                  if(op<SelPriceMin || SelPriceMin==0)
                    {
                     SelPriceMin    = op;
                     SelPriceMinLot = lt;
                     SelPriceMinTic = tk;
                    }
                 }
              }
              //---
              if(b>CloseLim && CloseLim!=0)
                if(OrderClose (BuyPriceMaxTic, BuyPriceMaxLot, Bid , Slippage, clrBlue)) 
                  return;
                
              if(s>CloseLim && CloseLim!=0)
                if(OrderClose (SelPriceMinTic, SelPriceMinLot, Ask , Slippage, clrRed)) 
                  return;
              //---
              if (BuyLotsSum - SelLotsSum != 0) 
                 FullBU = (WeighBuy - WeighSell)/(BuyLotsSum - SelLotsSum);
//*************************************************************//
   double   AwerageBuyPrice=0,AwerageSelPrice=0;
   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());

avatar

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

  • 2 июня 2024, 00:42
+
0
Клеим вторую часть.


//*************************************************************//
   double BuyLot=0,SelLot=0;
   
   if(!Agressor)
      {   
      if(BuyPriceMinLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
         
      if(SelPriceMaxLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
   else
      {   
      if(BuyPriceMinLot==0) 
         BuyLot=StartLots; 
      else 
         BuyLot=MathCeil(BuyPriceMinLot * 100 * CoeffLots)/100;
      if(SelPriceMaxLot==0) 
         SelLot=StartLots; 
      else 
         SelLot=MathCeil(SelPriceMaxLot * 100 * CoeffLots)/100;
      }
//*************************************************************//
   if(BuyLot>MaximalLots)      
      BuyLot=MaximalLots;
   if(SelLot>MaximalLots)      
      SelLot=MaximalLots;
   if(!CheckVolumeValue(BuyLot) || !CheckVolumeValue(SelLot))
      return;   
//*************************************************************//
   if(Metod==Normal)
     {
      if(Signal()==OP_BUY)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
   
      if(Signal()==OP_SELL)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
     }
   //---   
   if(Metod==Shaman)
     {
      if(Signal()==OP_BUY && Ask<FullBU)
         if((b==0) || (b>0 && Ask<=BuyPriceMin-PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),Slippage,0,0," ",MagicNumber,0,clrBlue)<0)
               Print("OrderSend error #",GetLastError());
   
      if(Signal()==OP_SELL && Bid>FullBU)
         if((s==0) || (s>0 && Bid>=SelPriceMax+PointOrderStep*Point()))
            if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),Slippage,0,0," ",MagicNumber,0,clrRed)<0)
               Print("OrderSend error #",GetLastError());
     }
//*************************************************************//
   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());
               tp=NormalizeDouble(OrderTakeProfit(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();

               if(OrderType()==OP_BUY && b==1 && tp==0)
                  if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Ask+TakeProfit*Point(),Digits()),0,clrNONE))
                     Print("OrderModify error #",GetLastError());

               if(OrderType()==OP_SELL && s==1 && tp==0)
                  if(!OrderModify(tk,op,OrderStopLoss(),NormalizeDouble(Bid-TakeProfit*Point(),Digits()),0,clrNONE))
                     Print("OrderModify error #",GetLastError());

               if(OrderType()==OP_BUY && b>=2)
                 {
                  if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                     if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                        if(!OrderModify(tk,op,OrderStopLoss(),AwerageBuyPrice,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                  if(tk!=BuyPriceMaxTic && tk!=BuyPriceMinTic && tp!=0)
                     if(!OrderModify(tk,op,0,0,0,clrNONE))
                        Print("OrderModify error #",GetLastError());
                 }
               if(OrderType()==OP_SELL && s>=2)
                 {
                  if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                     if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                        if(!OrderModify(tk,op,OrderStopLoss(),AwerageSelPrice,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                  if(tk!=SelPriceMaxTic && tk!=SelPriceMinTic && tp!=0)
                     if(!OrderModify(tk,op,0,0,0,clrNONE))
                        Print("OrderModify error #",GetLastError());
                 }
              }
              //---
              double Prof = GetProfit();
              if((LevelStopLoss>0 && Prof<=-LevelStopLoss) || (LevelStopProfit>0 && Prof>=LevelStopProfit))
                CloseAll();
  }
//************************************************************************************************/
bool CheckVolumeValue(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);
  }
//************************************************************************************************/
/*СИГНАЛ*/
//------------------------------------------------------------------	
int Signal()                   // Создаем функцию получения сигнала на указанном ТФ и баре
{
        double current_openprice = iOpen (Symbol(),TF , iB);
        double Mashka =iMA(NULL,0,Per_MA,0,0,4,iB) ;
        double Atrium=0;
        
          Atrium  = 0.2 * iATR(NULL,TF_ATR,Per_MA,iB);
         
          if(Bid>=current_openprice)                                               
            {
            SellBuff = (58000000.0 * (Bid  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Low[iB]   - Mashka) * Atrium);
            }
          if(Bid<current_openprice)
            {
            SellBuff = (58000000.0 * (High[iB]  - Mashka) * Atrium);
            BuyBuff  = (58000000.0 * (Bid   - Mashka) * Atrium);
            }
          if (SellBuff >  LevelSell) 
            return OP_SELL;
          
          if (BuyBuff < -LevelBuy) 
            return OP_BUY;
	return -1;                   // Иначе нет сигнала. Возвращаем в int Signai () -1 (никаких сигналов)
}
//************************************************************************************************
double GetProfit()
{  
   double Profit=0;
     
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              Profit += OrderProfit() + OrderCommission() + OrderSwap();
   return (Profit);
}
//************************************************************************************************
bool CloseAll()
{ 
   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)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Sleep(500);
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Sleep(500);
              }
   return true;
}
//************************************************************************************************

avatar

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

  • 2 июня 2024, 00:44
+
0
Сделал виртуальный тп на все ордера, чтобы модификации постоянной не было.


               if(OrderType()==OP_BUY)
                 { 
                  if(b>0 && TakeProfit!=0 && Bid>=op + TakeProfit * Point) 
                    {
                     if (OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,clrNONE))
                     Print("Virt TP Buy");
                    }
                  if(b>=2)
                    {
                     if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                      if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                        if(!OrderModify(tk,op,OrderStopLoss(),AwerageBuyPrice,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                     if(tk!=BuyPriceMaxTic && tk!=BuyPriceMinTic && tp!=0)
                      if(!OrderModify(tk,op,0,0,0,clrNONE))
                        Print("OrderModify error #",GetLastError());
                    }
                 }
               if(OrderType()==OP_SELL)
                 {
                  if(s>0 && TakeProfit!=0 && Ask<=op - TakeProfit * Point) 
                    {
                     if (OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,clrNONE))
                     Print("Virt TP Sell");
                    }
                  if(s>=2)
                    {
                     if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                       if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                        if(!OrderModify(tk,op,OrderStopLoss(),AwerageSelPrice,0,clrNONE))
                           Print("OrderModify error #",GetLastError());

                     if(tk!=SelPriceMaxTic && tk!=SelPriceMinTic && tp!=0)
                      if(!OrderModify(tk,op,0,0,0,clrNONE))
                        Print("OrderModify error #",GetLastError());
                    }
                 }
avatar

  15  OSS5 Сообщений: 168

  • 2 июня 2024, 13:14
+
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());
               tp = NormalizeDouble(OrderTakeProfit(),Digits());
               lt = NormalizeDouble(OrderLots(),2);
               tk = OrderTicket();
            //---
            if(OrderType()==OP_BUY)
               {
               if(b>0 && TakeProfit!=0 && Bid>=op + TakeProfit * Point) 
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,clrNONE))
                     Print("Virt TP Buy");
                  else
                     Print("Order Buy Close by TP error #",GetLastError());
               //---
               if(b>=CountAverage)
                  if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                     if(Bid<=AwerageBuyPrice)
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,clrNONE))
                           Print("Virt TP Buy");
                        else
                           Print("Order Buy Close by Awerage error #",GetLastError());
               }
            //------
            if(OrderType()==OP_SELL)
               {
               if(s>0 && TakeProfit!=0 && Ask<=op - TakeProfit * Point) 
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage,clrNONE))
                     Print("Virt TP Buy");
                  else
                     Print("Order Buy Close by TP error #",GetLastError());
               //---
               if(s>=CountAverage)
                  if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                     if(Ask>=AwerageSelPrice)
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage,clrNONE))
                           Print("Virt TP Sell");
                        else
                           Print("Order Sell Close by Awerage error #",GetLastError());
               }
            }
}                
avatar

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

  • 3 июня 2024, 00:04
+
0
Андрей, вот хороший вы человек, но почему эксперт без названия. Назвал его «kvashnin007Shaman».
Спасибо, поглядим.
avatar

  15  OSS5 Сообщений: 168

  • 2 июня 2024, 07:51
+
0
Каюсь. Хороший.
Только это не лучший вариант. Может открыть топик и заново обсосать идею? Задела меня идея открытия ордеров каждые Х секунд.
Особенно в связи с последней идеей малодоходного советника с большим числом сделок (абсолютная нирвана для брокера) с расчетом на программу возврата части спреда.
Редактирован: 4 июня 2024, 14:52
avatar

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

  • 2 июня 2024, 10:16
+
0
Наверное стоит открыть новый топик, здесь за эксперты Shamana идет речь.
avatar

  15  OSS5 Сообщений: 168

  • 2 июня 2024, 13:05
+
0




Поработал одним из сетов и вердикт стало лучше и безопаснее. Поставлю на ВПС сейчас его и отдохну немного.
Андрей, как и говорил если отрезать лишние ордера советник станет стабильнее. Посмотрим на него в реал тайм. Кстати предположу, что если советник бы не открывал позиции в обе стороны при нагрузке на депо -10% например ( чтобы можно было регулировать этот параметр в %) было бы еще круче. А то стоп это фактический показатель. Сумбурно? — Да!!)) Красава, этого в советнике и не хватало. Думаю Шаман был бы доволен. Вообще интересно, его мысли на счет советника. Может поделишься перепиской или какими нибудь дословными идеями его?
avatar

  4  Jimirami Сообщений: 44

  • 2 июня 2024, 18:09
+
0
Тестируете по контрольным точкам, у меня как-то не зашло. Можете выложить сет сюда или скан настроек, ну или его прогнать по всем тикам.
avatar

  15  OSS5 Сообщений: 168

  • 2 июня 2024, 20:05
+
0
Я поступаю так. Тестирую по ценам открытия. Выбираю меньшую просадку не с меньшим количеством сделок. Перебираю полученное на контрольных точках. Выбираю более красивую линию. Проверяю на тиках. Т.е. перебор по ценам открытия. Дальше выбираю на КТ. Проверяю на тиках. Не лучшие значения, но быстро и приемлемо.

Друзья давайте с чистого листа, как я писал по ссылке www.opentraders.ru/downloads/3846#comment1637

А то я не пойму о чем мы говорим. У меня этих вариантов доработок аж 11 штук.
Надо как-то с начала и по порядку.

avatar

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

  • 2 июня 2024, 22:30
+
0
Не торопитесь с ВПС результаты с контрольных точек и всех тиков могут очень сильно отличаться
avatar

  22  ruslan71 Сообщений: 1009 - Руслан

  • 4 июня 2024, 14:23
+
0
Кстати имеется какой-то баг с открытиями и закрытиями ордеров. Пока не понял, но советник немного по другому открывает ордера нежели предыдущая версия.АТР иначе работает?
Советник должен был закрыть ордера но не закрыл
Редактирован: 2 июня 2024, 19:37
avatar

  4  Jimirami Сообщений: 44

  • 2 июня 2024, 18:57
+
0
Поэтому и сделал виртуальный тп на все ордера, чтобы не мешать модификации крайних ордеров.
avatar

  15  OSS5 Сообщений: 168

  • 2 июня 2024, 20:02
+
0
Там как бы не должны быть помехи. Стали ордера крайними. Выставили им ТР в БУ+. Появился следующий ордер и какой-то из двух уже стал внутренним. Ему нужно выставить «родной» ТР. Обнулил. Далее робот видит Нуль и выставляет ему «родной» ТР.

Тут может возникать ошибка из-за levelstop. Так что виртуал полезнее. Единственное недоразумение может возникнуть, когда VPN подвис, а мы не ограничены. Бардак. Радует, что это не SL. Хотя радость недолгая. Надо будет продумать этот вопрос. Позднее. Пока можно и так.
avatar

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

  • 3 июня 2024, 00:21
+
0
"… Советник должен был закрыть ордера но не закрыл"

Здесь не понял: а что не закрылось?
Редактирован: 3 июня 2024, 00:08
avatar

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

  • 3 июня 2024, 00:07
+
0
не знаю Андрей, как-то совсем советник по другому работает. Какие изменения ты ввел в эту версию помимо Level-Loss-profit? может что-то убрал и все стало иначе.
avatar

  4  Jimirami Сообщений: 44

  • 3 июня 2024, 20:27
+
0
Нет. Просто виртуализировал ТР при усреднении. Там, кажется надо все по Bid делать. А лучше ставь вариант OSS5.
avatar

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

  • 4 июня 2024, 14:50

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