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

#define MODE_BUY   0
#define MODE_SELL  1

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

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

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



avatar

kvashnin007

  • 3 июля 2022, 22:46
+1
Нет, брат, извини.
Не мой уровень.
avatar

kvashnin007

  • 2 июля 2022, 19:28
0
На здоровье.
И Вам не хворать.
avatar

kvashnin007

  • 2 июля 2022, 07:32
+1
Качайте с облака склейку.
disk.yandex.ru/d/CBcsqjPSOufJyQ
avatar

kvashnin007

  • 28 июня 2022, 18:52
0
есть более интересные входы по свечным анализам


Во-первых это выражение голословно по двум причинам:
1. Не плохо бы пальчиком ткнуть хотя бы в ту сторону.
2. Есть много хорошего и кроме свечного анализа.

Я, например, знаю одного трейдера, который лет 17 назад открылся на понижение Иены и только периодически снимает часть прибыли, а вторую не глядя ни на какие там индикаторы, пирамидит.

Хотел бы Вас увидеть в дисскусии с ним о том, что есть, а что лучше.

У каждого додика своя…
Главное чтобы именно Вам была польза.
А зарабатывать может и сова с ошибочным кодом, не говоря уж о идее.
Она всё равно сольёт. Попозже. Советник — всего лишь помощник.

И ещё. Главное не только вход в рынок, но и сопровождение сделок. Равно, как и выход из него.
avatar

kvashnin007

  • 28 июня 2022, 16:54
0
Дерьмо это, а не советник. Да прости меня, автор.
avatar

kvashnin007

  • 28 июня 2022, 16:42
0
Продолжение совы, если надо склеите.

<code>//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+
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(OrderType()==OP_BUY && Bid >= op+LevelBU*Point)
                {
                sl = NSL(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 = NSL(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 NSL(int dir, double oop) // Нормализация цены стоплоса
{
   double SL = LevelBU; 

	if (SL==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-SL*Point;
	   return NP(MathMin(_sl, _pr-StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   double _sl=oop+SL*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); 
}
//+------------------------------------------------------------------+
</code</code>


За месяц без особой настройки из 1000$:



переменные для USDCHF:

Прибыль 982.67 $ при просадке 5.64%

LotK=0.7 OrderStep=33 MinProfit=16 MaxCountOrders=28 LevelStopLoss=0 LevelStopProfit=0 LevelBU=330 Risk=0 StartLots=0.02 MagicNumber=1961 Slippage=30

Если использовать RSI, то только для замены шага сетки.
Можно и ещё всякой лабуды навесить, но, во-первых, это уже будет другой советник. Во-вторых — всё равно сливной.

А вообще-то пересмотрите своё отношение к индикаторам.
avatar

kvashnin007

  • 28 июня 2022, 16:36
+1
Zheni, Вы, конечно, извините, но этот советник создавался для проверки идеи Сергея. Не ставилась задача создать абы что, лишь бы что-то там зарабатывалО.
Идея оказалась не совсем удачной. Вычеркнули и пошли проверять следующую. По другому никак. И Вам рекомендую, если это имеет значение.

Вот вам порождение этой идеи, которая при наличии опыта и ответственности, не сливает. Но в нём нет того «АХ», на который изначально рассчитывали. Правда от первоначальной идеи пришлось отползти слегка.

<code>//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk (in %) на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.02;      // Start lot
input double          LotK                = 2.1;       // K Lot   Коэффициент увеличения лота
input int             OrderStep           = 168;       // Order step (in pips)
input int             MinProfit           = 21;        // Minimal profit (in pips) for close Average orders
input int             MaxCountOrders      = 22;        // Count Orders максимальное число ордеров в рынке.
input double          LevelStopLoss       = 0;         // Level Loss   (in $).
input double          LevelStopProfit     = 0;         // Level Profit (in $).
input int             LevelBU             = 0;         // Level BU     (in pips).
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit; // В деньгах
//       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,0,0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,0,0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=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();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyAllProfit += pr+OrderCommission()+OrderSwap();
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelAllProfit += pr+OrderCommission()+OrderSwap();
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
         double AllProfit = BuyAllProfit + SelAllProfit;
       //-----------------------------------------------------------------------------------        
      if(Ask>=BuyPriceMax + OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,NL(MathCeil(StartLot*100*LotK)/100),NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            
            tk=OrderSend(NULL,OP_BUY, NL(MathCeil(StartLot*100*LotK)/100),NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
         //---              
         if((AllProfit>=LevelStopProfit && LevelStopProfit!=0) || (-AllProfit>=LevelStopLoss && LevelStopLoss!=0))
            CloseAll();
                
         if(LevelBU>0) 
            BU();
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
></code>
avatar

kvashnin007

  • 28 июня 2022, 16:20
0
Я бы не отказывался зарабатывать.
avatar

kvashnin007

  • 27 июня 2022, 19:18
0
Ты предлагаешь замки просто закрывать?
На закрытие по SL могу ответить, что это классика. А я рок люблю.
А если входы точные, то можно и без стопов работать. Ибо короткие стопы часто сопряжены с ошибкой 130.

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

kvashnin007

  • 27 июня 2022, 19:14
+1
Из всей торговой толчеи меня больше всего раздражает то, что мы называем техническим или фундаментальным анализом.
Величайшая глупость по моему мнению.
Ходил я как-то на платное обучение… сливу депозита. Индикаторы, тренды, прогнозы и прочая лабуда. Пробовал торговать, но ходил вокруг ноля. И то — это потому, что хорошо учился.

Пришлось самому наблюдать и думать. Победила теория, что на рынке рулит человеческая психология и мани менеджмент. Вот тогда я начал пробовать торговать против всяких анализов. Сейчас это называется — «против толпы». Придумав свои способы обхода просадки я начал немного зарабатывать. Но… прогнозируемо слил. Рынки созданы не для таких, как я.

Вот тогда я и задумался над тем, что бы было пофиг куда цена пойдёт. Самое главное, что бы куда-нибудь шла. Ну а я при этом зарабатывал бы. Алгоритмы давно разработаны, но они не для ручной торговли.
Поэтому я здесь.
avatar

kvashnin007

  • 27 июня 2022, 19:04
+1
Да,… Богиня.
Посмотрел я ваши скрины и хоть ничего практически не видно, вывод о том, что вы используете какой-то другой советник утвердилась окончательно.

Ни один из написанных, исправленных и выложенных здесь советников не может давать такие результаты. У вас довольно короткий ТР. 6.5 пунктов. он более подходит торговле на свечных потернах.
Да и мани менеждмент не проглядывается от слова совсем.
Не знаю, что за советник, но ему явно чего-то не хватает.
Хотя работает изумительно.

Я то подумал, что это то, что поправлял и был тогда поражен.
Но это другое? Или где-то закралась ошибка.
avatar

kvashnin007

  • 27 июня 2022, 18:44
+1
Зарабатывать надо на любом рынке. Я Татьяне советовал. Снять вложенную штуку из прибыли.
avatar

kvashnin007

  • 27 июня 2022, 16:23
+1
Открою маленький секрет. Только Вы уж никому…
В любом советнике, первоочередное — идея. Программирование вторично.
Инженер приверженец точного расчета и, что не менее важно, понимает возможность отклонений. А только при понимании этого возможно создать хороший алгоритм. Ну а с программистом — как повезёт. Хороший программист не только знает, но и понимает тему вопроса. А вот эту тему он, скорее всего, не создаст. Заточен под другое.

Поэтому самым важным Вы обладаете. Я тоже не силён в программировании. Поэтому я здесь.
Хотел сколотить банду, привлечь в неё программистов и создавать советники. Идей то много. И не только у меня. У Вас их тоже есть.
Но с наскока не сошлось. И маркетинг — фуфло.

Отрицательный замок — вещь очень не айс. Если не знаешь, что с ним делать. О… так я ещё и англиЦки могу?

Попал в тупик, нет сил смотреть, как дэпо сливается.
ЗаТкнул убыток в замок на потом, а когда это потом наступило, то началось. По кусочку, по чуть-чуть…

А сточки зрения математики, Вы просто не зафиксировали убыток. Видимо нужен был красивый график дэпо. Или всё же бабки?
Это тоже самое, что Вы согласились с убытком и продолжили пытаться зарабатывать дальше. Упокоившись таки наконец и более эффективно.

А я вот как-то решил вместо SL встречные замки делать. Потом озадачился их раскрытием. Много всего в нете перелопатил. Без толку. Подключил к решению свой калькулятор и когда понял одну простую вещь, всё стало на свои места. Мысль простая, но Вы о ней тоже ни-ни.

Депозит=прибыль-убыток.
С прибылью то всё как раз понятно.
А вот чтобы депозит увеличивался без роста прибыли, надо убыток сокращать. А лучше переводить его в положительное поле.
avatar

kvashnin007

  • 27 июня 2022, 16:18
+1
Ого. Неожиданно.
Приятно иметь дело с думающим человеком.

Глупо с моей стороны, но постараюсь по пунктам.

1. Размер дэпо больной вопрос. Чем больше дэпо, тем…
Поговорим о минимальном, который сможет выдержать такую роскошь.
Центовые счета пропустим. Я советники тестирую для дэпо 1000$. Просадку в 35% считаю нормальной, ибо деньги должны работать на 100%, но бывает всякое. Поэтому ± 35%.
Размер минимального дэпо можно будет получить после тестирования совы, которую мы потом, может быть!!! напишем.
А дальше от размера дэпо будет зависеть только увеличение нужных переменных. Короче. Пока этот вопрос подвисает.

2. Сам алгоритм — сплошной хэдж. Какие-то другие варианты хэджирования — это уже другой алгоритм. Пока не рассматриваю.

3. Ручные извращения полезны для здоровья, но не для моего.
Они приведут только к дополнительным проблемам. Например к нелюбимым нами полным замкам. Типа потом решим. Ручные действия осуществляются по какому-то алгоритму. А с алгоритмом машина справляется лучше человека. Человеческое же влияние в моём понимании — открыть, закрыть, переместить. Можно лапками, можно скриптом. Не важно. Вопрос не рассматриваю.

4. Смысл стратегии начинается от одного спреда и выше.
5.… в канале минимально от 5-6 спредов. Лучше от 10-12-15-20.

Утверждение спорное. Пусть советник сам определит.

6. — по 2 спреда в обе стороны на запазывание, проскальзывание. 2 спреда — прибыль.

Аналогично пятому пункту. И не считаю правильным прибыль измерять спредами. Пунктами. Деньгами.

И самое главное.

Моё всё в торговле:
Сохрани дэпозит сначала, заработаешь потом. На слитом дэпо точно не заработаешь.


Вижу Ваши волнения именно из-за этого вопроса. Он меня тоже занимает. Очень.

Там, где-то ниже, я предложил сочувствующим всего лишь два варианта расчета лотов, с полным сохранением идеи алгоритма.
Только они уже позволили снизить нагрузку на свободную маржу чуть ли не на 40%. А их ещё есть у меня. Просто не вижу смысла здесь метать бисер. Не интересно? Ну и ладно.
Кроме того разработал «кнопку SOS»
Маржа стала ниже нами допустимого процента или просадка по эквити или количество ордеров превысила допустимое значение — советник «нажимает» на эту кнопку.
А дальше — алгоритм, который умеет почти мгновенно (2-3 дня) разруливать любые замки. При этом может ещё и заработать больше, чем на основном алгоритме.
avatar

kvashnin007

  • 27 июня 2022, 14:43
0
Только добавлен цикл подсчета суммы лотов покупок и продаж.

<code>double LB=0,LS=0;
   
   for(int i=0; i<OrdersTotal(); i++)    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==maga)
            {
            if(OrderType()==OP_BUY)            
               LB+=OrderLots();
            if(OrderType()==OP_SELL)        
               LS+=OrderLots();
            }
</code>


Правда эти переменные нигде не используются.
Но функция написана правильно. Правда я немного упростил.
Люблю чистоту.

А так полный аналог Андрея.
Разница, конечно, будет из-за разных задержек и разной генерации тиков. Мизерная. Но не принципиальная.

Не стоит тратить время.
avatar

kvashnin007

  • 26 июня 2022, 14:03
0
Жадина.

А… муж. Ну так ему и надо. Потом возьмёте его к себе на работу.
Ну что бы под присмотром был. Я шутник — не обижайтесь.

— Мужчина, вы так похожи на моего пятого мужа.
— Да? И сколько ж у вас их было?
— Пока что четыре.

Хвастайтесь. Буду рад видеть, слышать.
avatar

kvashnin007

  • 26 июня 2022, 11:25
0
Думайте дальше. Не останавливайтесь.

Удачи. Был рад.
avatar

kvashnin007

  • 26 июня 2022, 11:18
0
Из трех вариантов лучшим оказался…

Сергей, только я семь вариантов давал.

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

kvashnin007

  • 26 июня 2022, 11:07