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

ssg

  • 6 апреля 2022, 19:56
0
Андрей, я понимаю так, что стоп и тейк добавлен про запас. Что бы не возвращаться?:) 
avatar

ssg

  • 6 апреля 2022, 19:40
0
Ордера закрывать руками будете?
avatar

ssg

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

ssg

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

ssg

  • 6 апреля 2022, 12:23
0
У Вас есть тестер стратегий.Тестируйте.:) 
avatar

ssg

  • 3 апреля 2022, 14:05
0
Я не говорил что есть ошибки. Я лишь высказал свое видение. У Вас на скрине от 31 марта есть уже индикатор по которому Вы торгуете. Андрей у Вас спрашивал формулы расчета индикатора. Если Вас устраивает Ваш индикатор и результаты торговли по нему тогда дайте код индикатора Андрею и попросите использовать его в советнике.
avatar

ssg

  • 3 апреля 2022, 11:04
0
Я понимаю что индикатор самый простой и написан для проверки в советнике.
Но стартовая разница

input double Delta=0.17;


со временем меняется и значит тестирование не корректное.
Может стоит считать дельту, хотя бы, как разницу средних по каждой паре:


Delta = Ma(s1)-Ma(s2);

или вообще считать по другому (например):

Delta = ((Close(s1)-Ma(s1))-(Close(s2)-Ma(s2)));
avatar

ssg

  • 3 апреля 2022, 08:55
0
Андрей, добрый вечер. В советнике у обоих пар одни и те же аск и бид.

 double Ask1=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Ask2=SymbolInfoDouble(Symb,SYMBOL_ASK);

   double Bid1=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double Bid2=SymbolInfoDouble(Symb,SYMBOL_BID);

   double sigma=MathAbs(s1[0]-s2[0])/_Point;

   CopyBuffer(ind,0,0,1,s1);
   CopyBuffer(ind,1,0,1,s2);

   if(PositionsTotal()<1 && sigma>Sigma)
     {
      if(s1[0]<s2[0])
        {
         trade.Buy(Lot,_Symbol,Ask1,0,0,"");
         trade.Sell(Lot,Symb,Bid1,0,0,"");
        }

      if(s1[0]>s2[0])
        {
         trade.Buy(Lot,Symb,Ask1,0,0,"");
         trade.Sell(Lot,_Symbol,Bid1,0,0,"");
        }
     }
avatar

ssg

  • 2 апреля 2022, 17:51
0
Посмотрите эту часть кода

  if(PositionsTotal()<1)
     {
      if(s1[0]<s2[0])
        {
         trade.Buy(Lot,_Symbol,Ask1,0,0,"");
         trade.Sell(Lot,Symb,Bid1,0,0,"");
        }

      if(s1[0]>s2[0])
        {
         trade.Buy(Lot,Symb,Ask1,0,0,"");
         trade.Sell(Lot,_Symbol,Bid1,0,0,"");
        }
     }
avatar

ssg

  • 2 апреля 2022, 16:25
0
Любой индикатор или функция корреляции из базы.
В своих советниках обычно использую такой вариант:


extern ENUM_TIMEFRAMES Tf = PERIOD_H1; // таймфрейм 
extern int    Correl_Period  = 14; 
extern double MinCor         = 0.50;  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
 double Correl(string base,string hedge,int shift)
   {
   shift=0;
   double u1=0,l1=0,s_1=0;
   int base_bn=iBarShift(base,0,Time[shift],false);
   int hedge_bn=iBarShift(hedge,0,Time[shift],false);   
   
      for(int i = Correl_Period - 1; i >= 0; i--){
         u1 +=(iClose(base,Tf,base_bn+i)-iMA(base,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,base_bn+i))* 
              (iClose(hedge,Tf,hedge_bn+i)-iMA(hedge,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,hedge_bn+i));
         l1 += MathPow(iClose(base,Tf,base_bn+i)-iMA(base,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,base_bn+i),2);
         s_1 += MathPow(iClose(hedge,Tf,hedge_bn+i)-iMA(hedge,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,hedge_bn+i),2);
      }
   double dMathSqrt = MathSqrt(l1*s_1);
   if(dMathSqrt > 0) 
       return(u1 / dMathSqrt);
    return(0);   
  }
//+------------------------------------------------------------------+
avatar

ssg

  • 27 марта 2022, 21:23
0
Анализа корреляции нет. Если добавить такой анализ и ввести минимальное значение корреляции тогда можно организовать автоторговлю двумя символами исходя из корреляции:
-если корр.>0 и корр.> минимума — купить А и продать В (продать А и купить В);
-если корр.<0 и корр.> минимума — купить А и купить В (продать А и продать В);
Пользователю будет проще торговать разными символами, так как в помощь ему приходит какая никакая статистика.Плюс случайный резкий скачок котировки одного символа будет игнорироваться.
Ну и в плане «другие предложения» — классическое усреднение убыточной позиции.
avatar

ssg

  • 27 марта 2022, 19:54
0
Может быть есть смысл добавить проверку на корреляцию между парами?
avatar

ssg

  • 27 марта 2022, 14:37
0
Смотрите:
<code>

#property copyright "Copyright 2019, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs

extern int    BuySell    = 0;        // 0-buy 1-sell
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 333;      // лось
extern int TakeProfit    = 444;      // язь
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int Slip          = 0;        // реквот
extern int Magic         = 123;      // магик
extern int CloseOn       = 0;        // 1-закрытие в конце работы

extern bool MonDay      = true;
extern bool TuesDay     = true;
extern bool WednesDay   = true;
extern bool ThursDay    = true;
extern bool FriDay      = true;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Trade()
  {
   if(DayOfWeek()==1 && MonDay)    return(true);
   if(DayOfWeek()==2 && TuesDay)   return(true);
   if(DayOfWeek()==3 && WednesDay) return(true);
   if(DayOfWeek()==4 && ThursDay)  return(true);
   if(DayOfWeek()==5 && FriDay)    return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double stopLoss,double takeProfit)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(){
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1){
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool TimeSession(int aStartHour,int aStartMinute,int aStopHour,int aStopMinute,datetime aTimeCur)
  {
//--- время начала сессии
   int StartTime=3600*aStartHour+60*aStartMinute;
//--- время окончания сессии
   int StopTime=3600*aStopHour+60*aStopMinute;
//--- текущее время в секундах от начала дня
   aTimeCur=aTimeCur%86400;
   if(StopTime<StartTime)
     {
      //--- переход через полночь
      if(aTimeCur>=StartTime || aTimeCur<StopTime)
        {
         return(true);
        }
     }
   else
     {
      //--- внутри одного дня
      if(aTimeCur>=StartTime && aTimeCur<StopTime)
        {
         return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && CloseOn>0)
     {
      CloseAll();
     }


   if(Trade() && CountTrades()<1)
     {
      if(TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
        {    
        if(BuySell==0)
         PutOrder(0,Ask,StopLoss,TakeProfit);
        if(BuySell==1)
         PutOrder(1,Bid,StopLoss,TakeProfit);
        }
     } 
   Comment("\n Time: ",TimeCurrent());
  }
//+----------------------------------------------------------------------------+
</code>
avatar

ssg

  • 11 марта 2022, 13:03
0
Смотрите описание кода которое я привел выше.
У Вас открытие позиций на нулевом баре!
avatar

ssg

  • 10 марта 2022, 12:05
0
Значит я не правильно понимаю код:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(TrailingStop>0)// если TrailingStop>0 тогда используется трал
      TrailingAll();
      
// начало перебора условий для открытия и открытие позиции
   if(CountTrades()<1)//  если нет позиций!!!
     {
      if(LastDealResult()==2 && LastDealType()==2)//если последняя позиции закрылась с убытком и эта была продажа
        {
         PutOrder(0,Ask);//тогда покупаем
        }

      if(LastDealResult()==2 && LastDealType()==1)//если последняя позиции закрылась с убытком и эта была покупка
        {
         PutOrder(1,Bid);//тогда продаем
        }
    // в том случае если  раньше небыло позици до этого или позиция закрылась с прибылью, тогда
      if((Close[0]>Open[0] && BuySell==0)||(BuySell==1))//если на текущем баре текущая цена больше цены открытия и разрешены покупки или разрешены покупки и продажи
        {
         PutOrder(0,Ask);//тогда покупаем
        }

      if((Close[0]<Open[0] && BuySell==0)||(BuySell==2))//если на текущем баре текущая цена меньше цены открытия и разрешены продажи или разрешены покупки и продажи
        {
         PutOrder(1,Bid);//тогда продаем
        }
     }//конец перебора условий для открытия и открытие позиции

   Comment("\n Lot: ",Lot());
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 7 марта 2022, 17:55
0
У Вас по определению одновременно разрешена только одна позиция.
avatar

ssg

  • 7 марта 2022, 17:02
0
1.У Вас есть трендовый индикатор который показывает общее движение цены в настоящий момент.
2.Вам нужно на основании этого движения определить наилучший момент входа в позицию. Для этого многие используют импульсные или осциляторные индикаторы на нижнем таймфрейме.
3.Стратегия Вашего советника заключается, по факту, в том, что при определенной просадке открыть противоположенную позиции большим лотом. Расчет на то, что большим лотом возместить убыток предыдущей позиции и получить некоторую прибыль. Допуская несколько переворотов.
4.Следовательно выбор сигнала для открытия позиции отходит на второй план.
Отсюда следует нет необходимости громоздить кучу индикаторы.
Например сигналом для открытия позиции может быть просто время.
avatar

ssg

  • 6 марта 2022, 13:04
0
Одна закрытая с прибылью сделка в день.
Все Ваши индикаторы — трендовые. Зачем их плодить?
avatar

ssg

  • 6 марта 2022, 05:41