なぜ私のEAはバックテスト時にマイナスの利益を出し続けるのでしょうか? - ページ 3

 
deVries:

メタトレーダー起動時にEAがトレードの有無を確認する必要があります。

トレードがある場合はトレードをチェックするためのカウントダウンのループだけをしています。

最初に1回でOrdersTotal()>0に設定したら、トレードをチェックさせる if(......> || ......> ){ループをする。

1440(1日)の期間でテストしましたが、取引は実行されませんでした。しかし、1Mに変更すると多くの取引が実行されました。
 
cyxstudio:
上記のような結果をもたらしたコードを私にくれたのは確かですか? 1440(1日)の期間でテストしましたが、取引は成立しませんでした。しかし、1Mに変更すると、多くの取引が成立しました。
あなたのデータは何日前に行ったのですか?もう一度私のテストを確認して ください。
 

さて、ここからが本題です......できることならここでお役に立ちたいと思います。

この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) このように、MA_Shiftを設定すると、MA200は0,200、MAは0,200、MAは0,200となります。
ご覧のように、このシフト設定はRSIには存在しません...それはそれ自身のウィンドウに表示されます...それが手がかりです。
チャート上に移動平均をドロップすると、シフトボックスの設定として、Ma_Shiftに相当するものが表示されます。
また、パラメータ200,8,sma,close.の順番は、インジケータを呼び出したときと同じです。
NULLとタイムフレームはMaをドロップした時のものです。
また、ラストシフトの設定も不要です。このMAは現在のローソク足で常に変化しているので 
このMAは現在のローソク足で常に変化しているからです。
iAlligatorのインジケーターの設定を見ると、顎のシフト、歯のシフト、唇のシフトの設定があります...これは、これらの移動平均のそれぞれのMaShiftです。
これらはすべて、チャート上で左右に何本でも移動させることができます。

このように表示される。

これは、データ・ウィンドウに示されているように、この08:00のローソク足の値に3ピップの差を生じさせます。

では、最後の "Shift "は何のためにあるのでしょうか?

データ・ウィンドウを開いたままチャートの上をマウスで移動し、ローソク足からローソク足へ移動すると

ローソク足からローソク足へと移動するにつれて、5SMAの数値が変化していくのがわかると思います...。

これが最後のSHIFTの値です...現在描かれているローソクは0本目であることに留意してください。

最後に完成した ローソク足がローソク足1なので、1000本のローソク足があるとして

チャートの左端にある999から、現在いる0まで逆順に番号が振られます。

つまり、5本前の5SMAの値を知りたければ、その最後の場所に5をつける。

もちろん、時間が経つにつれて、5本目のロウソクは次のロウソクに変わります。

今述べたように、もしあなたが常にローソク足0の値を取得しているなら、その値は常に価格によって変化しています。

価格と一緒に変化しています。だから、あなたは信号を取ると、インジケータがあなたに再描画されることがあります...しかし、あなたがいる場合

常にキャンドル1からの情報を求めている場合、それは行われており、変更されません....

私はこれが役立つことを願っています...

 
cyxstudio:

私はすべてをやり直し、ループ、スリッページを修正し、移動平均とRSIの値を修正し、すべてのオープンポジションが新しいポジションを開始する前にクローズされることを確認しました。しかし、私はそれをバックテストするとき、何も起こりません、買い/売りは実行されていません。



init()関数は起動時のみ実行され、start()関数のように毎ティック 実行されるわけではありません。
 

リペア済み

EAが新しいポジションを開くことを決定する前に、保留中の注文が あるかどうかをチェックする機能を追加する。もし、未決済の注文があれば、それ以上オープンしようとしない。

OrdersTotalが> 0である限り、未決済の注文があり、私のEAはそれ以上のポジションを開こうとしません。

減少ループを修正しました。

今度は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:

リペア済み

EAが新しいポジションを開くことを決定する前に、保留中の注文があるかどうかをチェックする機能を追加する。もし、未決済の注文があれば、それ以上オープンしようとしない。

OrdersTotalが> 0である限り、未決済の注文があり、私のEAはそれ以上のポジションを開こうとしません。

減少ループを修正しました。

今度はOrderCloseエラー138が発生し、これはrefreshrates()を追加しても解決できません。

そして、私はまだ私がそうであってはならないお金を失うことになる。

他に修正する方法が思いつきません...。

なぜ、自分の口座でEAが開いている取引を確認 する前に、買いを開くロジックを配置したのですか?

今までのプログラミングではどうなるのでしょうか?

EAが稼働している口座があるとします。あなたは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:

なぜ、EAが自分の口座で開いている取引を確認する前に、買いを開くロジックを配置したのでしょうか?

今までのプログラミングではどうなるのでしょうか?

EAが稼働している口座があるとします。あなたはGBPUSDの取引を手動で開いたとします。

その取引でOrdersTotal()は何回取引されていますか?

あなたのコード......BUYの場合

これは今何をして いるのでしょうか?


買いの条件が満たされ、かつポジションが開設されていない場合にのみ買う。
 
cyxstudio:

買いの条件が満たされ、かつポジションが開設されていない場合のみ、買います。

あなたがEAで稼動している口座を持っていると仮定します。GBPUSDの取引を手動で開始します。

この場合、条件は真になりますか?

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

あなたのコードを拝見させていただけませんか?

なぜ失敗したのか、どうすればうまくいくのか知りたいです。

.

あなたのメッセージは、私が直接あなたに完全なコードを与えることができます.......

そのためにはジョブズ セクションを利用し、お金を払う必要があります。

あなたはそれをそこに取得します。

.

もう一つの方法は、あなたのトピックをよく読むことです。

私たちは、あなたが自分でプログラミングする方法を学ぶのを手伝っています。 これは無料のヘルプです。

我々は、あなたのエラーを表示し、解決する方法の方向にあなたを助ける。

私はあなたがそれを記述する方法を学んだ瞬間に私が持っているコードを表示する....

その後、支払う必要はありませんし、その瞬間は、このフォーラムの助けを借りて、ここで作ったコードでそれを比較することができます

....

ここで私の最後の質問はまだ答えていない

あなたがあなたのEAで実行されているアカウントを持っていると仮定します。あなたはGBPUSDのために手動で取引を開く。

条件は真になるのでしょうか?

 if (OrdersTotal() == 0 )

.

.他のトピックでOrderClose error 138

あなたは非常によくそこに助けられている(RaptorUKとWHRoederは 私は非常によくやったと思うそこに説明をありがとうござい ました

.

私はあなたのために持っている別の質問は次のとおりです。

なぜあなたは、この計算移動平均のTimeframeを変更しました

   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

これは、私が与えたのと同じではありません。

他のチャートでは正しい値が計算されません。

.

だから、時間をかけて学習し、練習して、このフォーラムでここに得る助けを注意深く読んでください。

または、ジョブズの ようなサイトであなたのためにプログラミングするために誰かを支払う

 
deVries:
cyxstudio2013.01.31 18:04

あなたのコードを拝見させていただけませんか?

なぜ失敗したのか、どうすればうまくいくのか知りたいです。

.

あなたのメッセージは、私が直接あなたに完全なコードを与えることができます.......

そのためにはジョブズ セクションを利用し、お金を払う必要があります。

あなたはそれをそこに取得します。

.

もう一つの方法は、あなたのトピックをよく読むことです。

私たちは、あなたが自分でプログラミングする方法を学ぶのを手伝っています。 これは無料のヘルプです。

我々は、あなたのエラーを表示し、解決する方法の方向にあなたを助ける。

私はあなたがそれを記述する方法を学んだ瞬間に私が持っているコードを表示する....

その後、支払う必要はありませんし、その瞬間は、このフォーラムの助けを借りて、ここで作ったコードでそれを比較することができます

....

ここで私の最後の質問はまだ答えていない

あなたがあなたのEAで実行されているアカウントを持っていると仮定します。あなたはGBPUSDのために手動で取引を開く。

条件は真になるのでしょうか?

.

.他のトピックでOrderClose error 138

あなたは非常によくそこに助けられている(RaptorUKとWHRoederは 私は非常によくやったと思うそこに説明をありがとうござい ました

.

私はあなたのために持っている別の質問は次のとおりです。

なぜあなたは、この計算移動平均のTimeframeを変更しました

これは私が与えたのと同じではありません。

他のチャートでは正しい値が計算されません。

.

だから、時間をかけて学習し、練習して、このフォーラムでここに得る助けを注意深く読んでください。

または、ジョブズの ようなサイトであなたのためにプログラミングするために誰かを支払う

OrdersTotal()は、EAや手動で開いたものに関わらず、保留中の注文や成行注文の合計金額を明らかにするものなのでしょうか?

私はこのように考えていました。私のEAは常に未決済注文があるかどうかをチェックし、もしあればそれ以上注文を出さず、未決済注文がないときのみ新規注文を出します。

if (OrdersTotal() == 0 )

結果欄には1,1,2,2,3,3,4,4という注文順序が表示されているので、うまくいっていると思うのですが、これは新しい注文が開かれる前に注文が閉じられていることを意味します。

移動平均とRSIの変数はテストのために変更されました。私は別の時間枠/期間で実験していましたが、ここに投稿するときに元に戻していません。

そして最も奇妙なのは、私のコードは買い注文しか実行されないということです。

簡単に言うと、私が今直面している問題です。

1.売りのコードを書いたのに、買いしか実行されず、売りが実行されない。

2.このストラテジーが想定していないマイナス利益を出している。