0
Новости здесь как раз в жилу. А вот алгоритм я бы изменил. Я бы каждый раз удваивал лот. Выставлял бы стоп-ордера по верхним-нижним фракталам или ZZ. По причине того, что эти линии чаще пробиваются импульсами. При активации любого стоп-ордера, второй бы тралил за ценой. Это бы «смягчило» мартингейл. Плюс сдвиг с границ флэта.

Вообще-то мысль стоит внимания. Вот вам и работа на флетах и на новостях.
avatar

kvashnin007

  • 15 апреля 2024, 16:43
+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>


avatar

kvashnin007

  • 13 апреля 2024, 18:37
+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>
avatar

kvashnin007

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

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

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





avatar

kvashnin007

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

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

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

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

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

kvashnin007

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

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

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

kvashnin007

  • 9 апреля 2024, 07:02
0
Мы все такие. Каждый, как может. В этом и интерес. Иначе скучно, девочки. И мальчики.
avatar

kvashnin007

  • 7 апреля 2024, 11:48
+2
Да… Вот Bishop хорошо резанул. Как взрослый мужчина. Все остальное — мышиная возня. Шаман не умел писать? Умел. Но с ошибками. Как в первом классе. Я вот тоже далеко не ушел. Только я, дойдя до ошибок типа 131 или других, которые сходу не решил, теряю интерес к теме. Шаман — упрямый сибиряк. Крутил, вертел, спрашивал… Но преодолевал. Хоть и тему выбрал не самую выигрышную, но выжал из нее все, что смог. Сейчас у нас появилась возможность воспользоваться результатами его труда. Давайте. Пользуемся.

Я все ждал, что кто-то откроет блог, где будут обсуждение и попытки доработки ЗаеБота с одной единственной целью. Зарабатывать, и всегда вспоминать — благодаря кому.
avatar

kvashnin007

  • 7 апреля 2024, 08:42
0
Художника обидеть может каждый. Даже поэт. А вообще-то жаба давит. Мне стихи никто не писал.
Вспоминаю фильм Приключения принца… там какого-то. Портрет Клетчатого. Просто вы не умеете правильно описать морду лица. Хоть и идея проста. Но бесперспективная.

В строке: «Быть может это грааль рожден,» следует слово ЭТО поменять на ТО. Пушкина читайте.
avatar

kvashnin007

  • 7 апреля 2024, 06:58
+1
Общался я с Серегой по поводу его советника. Дал он мне сову в открытом коде. Я был не совсем согласен с его некоторыми рассуждениями. Всего не помню. Первым делом доработал индикатор. Добавил дельту наружу — внутрь полосы на ложные пробойчики и недобойчики. Изменил формирование полосы. Кажется ушел от ATR. Что-то там еще. Не помню. По поводу его рассуждения по поводу пробоя-отбоя предлагал не гадать, а сразу использовать два варианта с мартином. К новостям тоже свой подход предлагал для универсальности. На новостях можно хорошо зарабатывать. Если на скачке, как правило, спред зашкаливает, то использовать практически всегда присутствующий откат скачка, как минимум до середины имбаланса. Но Сергей на том этапе уже не интересовался ни форексом, ни своим роботом. Так и забросили отработку. Если есть программист, желающий доработать ЗаеБота, могу конкретизировать.

Но сам по себе советник — бомба. С его помощью можно успешно и долго торговать.

Шаману вечная память.
avatar

kvashnin007

  • 21 марта 2024, 12:28
+1
Солидарен с АМИ.
avatar

kvashnin007

  • 21 марта 2024, 11:18
0
Уважаемый Каштан. Доброго. Интересно наблюдать за вашим фейерверком идей. Кажется мне, что вам не хватает терпения формализовать ТЗ. Перекрещусь. Но есть в ваших мыслях что-то от сушеного винограда (изюминка). Но из-за вашей спешки или лени (я вот лентяй неимоверный) Выхлоп около нулевой. В итоге можете разувериться в идее и спустить ее в унитаз. Извините за бестактность. Удачи.
avatar

kvashnin007

  • 16 марта 2024, 07:03
+1
Добрый день. ИИ не мой уровень. Хотя и не вижу здесь его применения. Индикатор доделываю. Он здесь нужнее. Тяжело идет. заказал на фрилансе сову по этой стратегии на МТ5. Вроде все написано по феншую, а не работает. Могу дать поюзать.
avatar

kvashnin007

  • 10 марта 2024, 20:45
0
ТР здесь совсем не нужен. Дошла цена до центральной МАшки — закрыли половину ордера, а вторую перевели в БУ. Дошла цена до противоположной границы полосы закрыли остаток. Есть вариант не закрыли, а протралили. SL на любителя. Я бы не ставил. Рассмотрел бы усреднение с шагом.
avatar

kvashnin007

  • 13 декабря 2023, 01:06
0
Руслан, привет. отработка любого события фифти фифти. Свершилось или нет. Хотя, если задать временной параметр, то я бы сказал, что есть три равновероятностных события. Цена отбилась от полосы, пробила полосу или осталась в полосе. с учетом относительно малых стопов и большим потенциалом получения прибыли, можно строить стратегию.

Есть и другие вспомогательные алгоритмы. Но это отдельная тема. Здесь её частично затронул Шаман, со своим ЗаеБотом. Но не развил её.

Сегодняшний уровень ИИ в трейдинге, что предлагается здесь, не способен тягаться с алгоритмом, предложенным умным человеком. Так что мой вывод: изучать надо, но пока рано на него рассчитывать.
Не навязываю.
avatar

kvashnin007

  • 31 марта 2023, 20:20
0
Ну уж точно не для моих познаний.
avatar

kvashnin007

  • 30 марта 2023, 21:09
0
Руслан, привет. Ерунда это всё. Моё мнение. Не навязываю.
avatar

kvashnin007

  • 30 марта 2023, 21:08