Почему мой советник продолжает давать отрицательную прибыль при обратном тестировании? - страница 3

 
deVries:

когда вы запускаете Metatrader, советник должен выяснить, открыта ли сделка.

Я делаю только цикл обратного отсчета для проверки сделок, если есть сделка.

Если я устанавливаю в начале на 1 и OrdersTotal() >0, то я делаю проверку сделок if(.......> || .......> ){делаю цикл....

Вы уверены, что дали мне код, который дал вам результаты, показанные выше? Я протестировал его на периоде 1440 (1 день) и ни одна сделка не была выполнена. однако когда я изменил его на 1M, многие сделки были выполнены.
 
cyxstudio:
вы уверены, что дали мне код, который дал вам результаты, показанные выше? я тестировал его на периоде 1440 (1 день) и ни одна сделка не была выполнена. однако когда я изменил его на 1M, многие сделки были выполнены
Если вы снова проверите мой тест, вы найдете период теста и таймфрейм, на котором он тестировался.
 

OK вот так..... Я попытаюсь помочь здесь, если смогу.

Этот вопрос по Ma_Shift был у меня некоторое время, но я так и не смог получить на него четкого ответа.

Если вы заметите в вашем коде, что вы используете сдвиг на 8 для ваших скользящих средних.... что это значит?

MA200 = iMA(NULL, 0, 200, 8,MODE_SMA,PRICE_CLOSE, 0); MA5 = iMA(NULL, 0, 5, 8,MODE_SMA,PRICE_CLOSE, 0); CurrentRSI = iRSI (NULL, 0, VarPeriod,PRICE_CLOSE ,0);
Как вы можете видеть, эта установка сдвига не существует на RSI... она отображается в собственном окне. Это подсказка.
Если вы поместите скользящую среднюю на свой график, вы увидите, что соответствует Ma_Shift в качестве настройки в окне Shift.
Также обратите внимание на порядок параметров 200,8,sma,close. при вызове индикатора.
 порядок, в котором они указаны в поле... NULL и таймфрейм - это то, на что вы опускаете Ma.
поэтому они здесь не нужны. также как и установка последнего сдвига... так как эта ma будет постоянно меняться на текущей свече. 
Вы поймете это через мгновение.
если вы посмотрите на настройки индикатора iAlligator, то увидите настройки для сдвига челюсти, сдвига зубов и сдвига губ... это MaShift каждой из этих скользящих средних.
Все они могут быть сдвинуты на графике влево или вправо на сколько угодно баров.

что отображается следующим образом............

Это делает разницу в 3 пункта в значении на этой свече 08:00, как показано здесь в окне данных.

Что приводит нас к вопросу: для чего нужна настройка "Shift" в конце?

Когда вы наводите курсор на график с открытым окном данных и перемещаетесь от свечи к свече.

вы увидите, как меняются цифры для 5 SMA при переходе от свечи к свече...

Именно в этом и заключается последнее значение SHIFT... помня о том, что текущая свеча, которая сейчас рисуется.

это нулевая свеча... последняя завершенная свеча - это свеча 1, так что если на вашем графике 1000 свечей, то они нумеруются в обратном порядке.

они нумеруются в обратном порядке от 999 на левом краю вашего графика до 0, где вы находитесь в данный момент.

Таким образом, если вы хотите узнать, какое значение 5 SMA было 5 завершенных свечей назад.

вы ставите 5 в этом последнем месте... конечно, с течением времени свеча 5 будет меняться на следующую свечу.

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

меняется вместе с ценой. Поэтому вы можете принять сигнал, и тогда индикатор перерисует вас... но если вы

всегда запрашиваете информацию от свечи 1, то это уже сделано и не изменится.

Надеюсь, это поможет...

 
cyxstudio:

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



Функция init() запускается только при старте, а не на каждом тике, как функция start(). Вам нужно вернуть скользящие средние в функцию start, а не в init(), чтобы она работала и получала свежие числа...
 

Переработанный

Добавьте функцию, при которой советник будет проверять наличие отложенных ордеров перед тем, как принять решение об открытии новой позиции. Если есть отложенный или открытый ордер, то он не будет пытаться открыть новую позицию.at

Я вижу, что все используют цикл для проверки наличия открытых позиций перед покупкой, я не вижу в этом логики. пока OrdersTotal > 0, есть открытые ордера, и мой советник не будет пытаться открыть больше позиций.

Исправил убывающий цикл.

На этот раз он выдает ошибку OrderClose 138, которая не решается добавлением refreshrates().

и я все еще теряю деньги, чего не должно быть.

Я не могу придумать, что еще можно исправить...

//+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int RSIPeriod        =  3;      //number of periods for RSI
extern double UpperBound    =  90;     //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI
extern int MASlowPeriod     = 200;
extern int MAFastPeriod     = 5;
extern double Lots  = 0.1;
extern double StopLoss      = 60;       //Set the stop loss level
extern double TakeProfit    = 120;       //Set the take profit level
extern double TrailingStop = 40;
//extra settings for OrderSend
extern int        MagicNumber = 54333;
extern string     CommentEA = "RSI strategy";
extern int        Slippage.Pips    = 3;


int    BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digits.pips;      // DoubleToStr(dbl/pips2dbl, Digits.pips)
//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
   if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point*10; pips2points = 10;   Digits.pips = 1;}
     else {pips2dbl = Point;    pips2points =  1;   Digits.pips = 0;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl        
//----      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   double MagicNo;
   double Slippage;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
  
   int Ticket2;
   int cnt;
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow)   ;       //execute buy order
   
    if(Ticket>0)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            
           }
         if (Ticket < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }
  
  }
  
  
 
  if (CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 0, Yellow)  ;     //execute sell order
       if(Ticket2>0)
           {
            if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("SELL order opened : ",OrderOpenPrice());
           
           }
         if (Ticket2<0) {
          Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      
   
   } 
   }
   
   if (OrdersTotal() > 0 ) {
   
   int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   RefreshRates();
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   
   if (pAsk > MA5){      //condition to close long position
   RefreshRates();
    OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long position
 
   return(0); // exit
   
   if(TrailingStop>0)  
              {                 
               if(pBid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<pBid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
   
  }
   
   if(pBid < MA5){       //condition to close short position
   RefreshRates();
   OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short position
  
   return(0); // exit
   
   
  if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
   }
   
      if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop
   
   
   }
  
   
   
   
   
   
        
        
           return(0);
}
 
cyxstudio:

Переработанный

Добавьте функцию, при которой советник будет проверять наличие отложенных ордеров, прежде чем принять решение об открытии новой позиции. Если есть отложенный или открытый ордер, то он не будет пытаться открыть новую позицию.at

Я вижу, что все используют цикл для проверки наличия открытых позиций перед покупкой, я не вижу в этом логики. пока OrdersTotal > 0, есть открытые ордера, и мой советник не будет пытаться открыть больше позиций.

Исправил убывающий цикл.

На этот раз он выдает ошибку OrderClose 138, которая не решается добавлением refreshrates().

и я все еще теряю деньги, чего не должно быть.

Я не могу придумать, что еще можно исправить...

Почему вы разместили логику для открытия покупки до того, как проверили сделки, открытые вашим советником на вашем счете ????.

Что произойдет сейчас ???? с тем программированием, которое у вас есть на данный момент?

Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.

Сколько сделок в OrdersTotal() с этой сделкой?

Ваш код.... для BUY

if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow)   ;       //execute buy order
   
    if(Ticket>0)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            
           }
         if (Ticket < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }
  

что он делает сейчас??? и по какой причине он это делает????

 
deVries:

Почему вы разместили логику для открытия покупки до того, как проверили сделки, которые советник открыл на вашем счете ????.

Что произойдет сейчас ???? с тем программированием, которое у вас есть на данный момент?

Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.

Сколько сделок в OrdersTotal() с этой сделкой?

Ваш код.... для BUY

что он делает сейчас??? и по какой причине он это делает????


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

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

Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.

будет ли условие истинным

 if (OrdersTotal() == 0 )
 
cyxstudio2013.01.31 18:04

не могли бы вы дать мне взглянуть на ваши коды?

Я хочу знать, почему у меня не получилось и как сделать это правильно.

.

Ваше сообщение мне Я могу дать вам полный код прямо.....

Это не будет бесплатно. Для этого вы должны использовать разделJobs и заплатить, чтобы получить его...

Вы получите его там

.

Другой способ - хорошо читать свои темы.

Мы помогаем вам здесь научиться программировать самостоятельно. Это бесплатная помощь.

Мы показываем вам ваши ошибки и помогаем вам в направлении, как решить.

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

Тогда не нужно платить, и вы можете в тот же момент сравнить его с кодом, который вы сделали здесь с помощью этого форума

....

мой последний вопрос все еще не получил ответа

Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.

будет ли условие истинным

 if (OrdersTotal() == 0 )

.

. В другой темеОшибка OrderClose 138

Вам там очень хорошо помогли(RaptorUK и WHRoeder спасибо за объяснение, я думаю очень хорошо сделано)

.

У меня к вам еще один вопрос

Почему вы изменили таймфрейм при расчете скользящей средней?

   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average

Это не то же самое, что я дал,

Он не вычисляет правильное значение на другом графике Daily

.

Так что уделите время обучению и практике и внимательно читайте помощь, которую вы получаете здесь, на этом форуме.

или вы платите кому-то, чтобы программировать для вас на сайте типа Jobs.

 
deVries:
cyxstudio2013.01.31 18:04

не могли бы вы дать мне взглянуть на ваши коды?

Я хочу знать, почему у меня не получилось и как сделать это правильно.

.

Ваше сообщение мне Я могу дать вам полный код прямо.....

Это не будет бесплатно. Для этого вы должны использовать разделJobs и заплатить, чтобы получить его...

Вы получите его там

.

Другой способ - хорошо читать свои темы.

Мы помогаем вам здесь научиться программировать самостоятельно. Это бесплатная помощь.

Мы показываем вам ваши ошибки и помогаем вам в направлении, как решить.

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

Тогда не нужно платить, и вы можете в тот же момент сравнить его с кодом, который вы сделали здесь с помощью этого форума

....

мой последний вопрос все еще не получил ответа

Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.

будет ли условие истинным

.

. В другой темеОшибка OrderClose 138

Вам там очень хорошо помогли(RaptorUK и WHRoeder спасибо за объяснения, я думаю очень хорошо сделано)

.

У меня к вам еще один вопрос

Почему вы изменили таймфрейм при расчете скользящей средней?

Это не то же самое, что я дал,

Он не вычисляет правильное значение на другом графике Daily

.

Поэтому уделите время обучению и практике и внимательно читайте помощь, которую вы получаете здесь, на этом форуме.

или вы платите кому-то, чтобы программировать для вас на сайте типа Jobs.

OrdersTotal() должна показывать общее количество отложенных ордеров и рыночных ордеров, независимо от того, были они открыты советником или вручную?

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

if (OrdersTotal() == 0 )

Я думаю, что советник работает нормально, потому что в разделе результатов отображается последовательность ордеров 1,1,2,2,3,3,4,4, что означает, что ордер закрыт до открытия нового ордера.

переменные для скользящей средней и RSI были изменены по причинам тестирования. Я экспериментировал на разных временных рамках/периодах, но не изменил их обратно, когда разместил здесь.

И самое странное, мой код исполняет ТОЛЬКО ордер на покупку. Он никогда не исполнял даже один... ордер на продажу. Это просто странно,

В двух словах, проблемы, с которыми я все еще сталкиваюсь сейчас.

1. он исполняет только buy, но никогда не исполняет sell, несмотря на то, что я закодировал sell.

2. все еще получает отрицательную прибыль, чего, я уверен, эта стратегия не должна делать.