移動平均線が交差したバーの時刻を求めるには?(コードはこちら)

 

Hey All!

私は、私のコードに関するいくつかの助けを期待していた - 現在、このいまいましい部分で立ち往生している!


これは、私が以下のコードに書き込もうとしているプロセスです。

1)すべてのMAが "ファン "アウトと価格がすべての移動平均の上にあるように交差しており、それらは長い可能性を示している場合。

2) それから、移動平均のクロスで移動平均が「ばらばらになった」正確なバーを(時間を使って)知りたいのです。

3) 1と2が本当なら、私は(ロングポジションの場合)どのバーも下がってきて、21EMAに触れるのを待ちます。

4) 最初のバー(移動平均線がクロスして広がったところ)から、現在21本EMAにタッチしているバーまで - この範囲(1&3)の高値より上に置かれた市場取引での保留中の注文 またはが欲しい。

5) 注文を出す前に、価格が60本EMAの下で終了した場合、その注文はキャンセルされます。

これは明らかにすべてのコードではありませんが、これは私が髪を引っ張っている主要な部分である。これらは、私が混乱している点です。

私は本当に誰かの助けを借りて行うことができます - それは本当に感謝されます。

本当にありがとうございました。

datetime          triggerBarTime;   <<<<< Global settings.
datetime          triggerBarTime1;  <<<<< Global settings.	



void CheckForMaTrade()
{

//+-----------------------------------------------------------------------------------------------------------------------+ 
    //Small and Big Fish on the H1 Time Frame.                                                                           |
//+-----------------------------------------------------------------------------------------------------------------------+              

   {
   double PreviousSmallFish1  =  iMA(NULL,60,3,0,1,0,2); 
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1);
   double PreviousSmallFish2  =  iMA(NULL,60,5,0,1,0,2);
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1);
   double PreviousSmallFish3  =  iMA(NULL,60,8,0,1,0,2);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1);
   double PreviousSmallFish4  =  iMA(NULL,60,10,0,1,0,2);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1);  
   double PreviousSmallFish5  =  iMA(NULL,60,12,0,1,0,2);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1);
   double PreviousSmallFish6  =  iMA(NULL,60,15,0,1,0,2);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1);  
   
      double PreviousBigFish1  =  iMA(NULL,60,30,0,1,0,2); 
      double CurrentBigFish1   =  iMA(NULL,60,30,0,1,0,1);
      double PreviousBigFish2  =  iMA(NULL,60,35,0,1,0,2);
      double CurrentBigFish2   =  iMA(NULL,60,35,0,1,0,1);
      double PreviousBigFish3  =  iMA(NULL,60,40,0,1,0,2);
      double CurrentBigFish3   =  iMA(NULL,60,40,0,1,0,1);
      double PreviousBigFish4  =  iMA(NULL,60,45,0,1,0,2);
      double CurrentBigFish4   =  iMA(NULL,60,45,0,1,0,1);
      double PreviousBigFish5  =  iMA(NULL,60,50,0,1,0,2);
      double CurrentBigFish5   =  iMA(NULL,60,50,0,1,0,1);
      double PreviousBigFish6  =  iMA(NULL,60,60,0,1,0,2);
      double CurrentBigFish6   =  iMA(NULL,60,60,0,1,0,1); 
      
            if(PreviousBigFish1<CurrentBigFish2 && CurrentBigFish1>PreviousBigFish2)
               if(PreviousBigFish2<CurrentBigFish3 && CurrentBigFish2>PreviousBigFish3)
                  if(PreviousBigFish3<CurrentBigFish4 && CurrentBigFish3>PreviousBigFish4)
                     if(PreviousBigFish4<CurrentBigFish5 && CurrentBigFish4>PreviousBigFish5)
                        if(PreviousBigFish5<CurrentBigFish6 && CurrentBigFish5>PreviousBigFish6)  
                           
                           if(PreviousSmallFish1<CurrentSmallFish2 && CurrentSmallFish1>PreviousSmallFish2)
                        if(PreviousSmallFish2<CurrentSmallFish3 && CurrentSmallFish2>PreviousSmallFish3)
                     if(PreviousSmallFish3<CurrentSmallFish4 && CurrentSmallFish3>PreviousSmallFish4)
                  if(PreviousSmallFish4<CurrentSmallFish5 && CurrentSmallFish4>PreviousSmallFish5)
                if(PreviousSmallFish5<CurrentSmallFish6 && CurrentSmallFish5>PreviousSmallFish6)triggerBarTime = Time[1];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      
      double ema21 = iMA(NULL,60,21,0,1,0,1); 
       
        
         if (Low[1]<ema21)
         {
         
           OrderEntry(0); // BUY 
            }     
      
      
                
     if(PreviousBigFish1>CurrentBigFish2 && CurrentBigFish1<PreviousBigFish2)
      if(PreviousBigFish2>CurrentBigFish3 && CurrentBigFish2<PreviousBigFish3)
         if(PreviousBigFish3>CurrentBigFish4 && CurrentBigFish3<PreviousBigFish4)
            if(PreviousBigFish4>CurrentBigFish5 && CurrentBigFish4<PreviousBigFish5)
               if(PreviousBigFish5>CurrentBigFish6 && CurrentBigFish5<PreviousBigFish6)
               
               if(PreviousSmallFish1>CurrentSmallFish2 && CurrentSmallFish1<PreviousSmallFish2)
            if(PreviousSmallFish2>CurrentSmallFish3 && CurrentSmallFish2<PreviousSmallFish3)
         if(PreviousSmallFish3>CurrentSmallFish4 && CurrentSmallFish3<PreviousSmallFish4)
       if(PreviousSmallFish4>CurrentSmallFish5 && CurrentSmallFish4<PreviousSmallFish5)
     if(PreviousSmallFish5>CurrentSmallFish6 && CurrentSmallFish5<PreviousSmallFish6)triggerBarTime = Time[1]; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
    double ema21_2 = iMA(NULL,60,21,0,1,0,1); 
  
            if(High[1]>ema21_2)
            {
             
              OrderEntry(1); // SELL
             }  
   
       }

}


//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;
   int buyStopCandle = iLowest(NULL,0,1,CandlesBack,1); 
   int sellStopCandle = iHighest(NULL,0,2,CandlesBack,1);
   
   double buyPrice = iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
   double sellPrice = iLowest(Symbol(), 0, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = Ask-buy_stop_price;         //double pips_to_bsl = Ask-buy_stop_price;   --- Old code
   double buy_takeprofit_price = Ask+pips_to_bsl*RewardRatio;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; //- Greyed out, this is an old code line.
   double pips_to_ssl = sell_stop_price-Bid;     ////double pips_to_ssl = sell_stop_price-Bid;   --- Old code
   double sell_takeprofit_price = Bid-pips_to_ssl*RewardRatio;   
   
  
   if (direction==0)//<< "0" pushes out a Buy direction
   {
      //double buyPrice = iHighest(Symbol(), 60, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);//-PadAmount*pips; // new line
      int Buy_Price = buyPrice;
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      //LotSize = (100/(0.00500/0.00010))/10
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) //--- This means that it will not open a new order if there is one already open!If greyed out, it will take everything.
      int buyticket = OrderSend(Symbol(),Buy_Price,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green); //ask
      if(buyticket>0)OrderModify(buyticket,OrderOpenPrice(),bsl,btp,0,CLR_NONE);
   }
            
   if (direction==1) //<< "1" pushes out a Sell direction
   {
      
      //double sellPrice = iLowest(Symbol(), 60, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);//+PadAmount*pips;   // new line.
      int Sell_Price = sellPrice;
      
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price; 
      //LotSize = (100/(0.00500/0.00010))/10;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  //--- This means that it will not open a new order if there is one already open! If greyed out, it will take everything.
      int sellticket = OrderSend(Symbol(),Sell_Price,LotSize,Bid,3,ssl,stp,NULL,MagicNumber,0,Red); //bid
      if(sellticket>0)OrderModify(sellticket,OrderOpenPrice(),ssl,stp,0,CLR_NONE);
   }
   
}

return(0);

 
DomGilberto:

皆さん、こんにちは。

これは明らかにすべてのコードではありませんが、これは私が髪を引っ張っている主要な部分です。これらは、私が混乱している点です。

使用している関数のドキュメントを読んでください ... ...iHighest() は価格を返しません ...int を返します "タイプに応じて特定の期間数にわたる最大値のシフトを 返します".
 

ありがとうRaptorUK - 親切に言うと、それは私に何も説明していないのですか?素人考えで?

これは、誰かが関数の 定義(私は "ヘルプ "セクションから100回を読んでいる...)を繰り返す以外に実際に私を助けることができるフォーラムです。

結局のところ、私が尋ねていることは、(ここのいくつかのスレッドと比較して!)誰かが彼らの時間のために充電することを正当化するのに十分であるとは思わないのですが...?

 

素人用語に翻訳することは、あなたを助けるでしょう...一度、今日、この特定の問題で...そして、説明者のためにある程度の時間がかかるでしょう。

もし、あなたが定義のどれが理解できないかを言えば、次は自分の問題を解決できるかもしれないし、しばらくして、他の人の問題を解決する人の一人になれるかもしれないのです。

また、自分で調べてみると、より多くのことを学ぶことができます。例えば、こんなことをやってみてください。

Alert(iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0));

この関数が どんな値を返しているのかがわかります。(Raptorが言うように、それは価格ではありません)。そして、おそらく関数の定義をより簡単に理解することができます。

このようなことは、掲示板の誰かがあなたのコードをテストし、あなたが自分で行う方法を学ぶべき同じトラブルシューティングを行う時間があることを望むよりも、あなたを助けるでしょう。

 

あれ?私はとても混乱しています - 私はいくつかの助けのためにあまりにも多くを求めるのですか?

結局のところ、私は一から私の全体のEAを構築しています(私は自分自身を教えた...)ただ、私よりも多くの知識を持つ誰かからいくつかの指導をしたい...:s。

 

"このようなことは、ボード上の誰かがあなたのコードをテストし、あなたが自分で行う方法を学ぶべきである同じトラブルシューティングを行う時間があることを望むよりも、あなたを助けるでしょう。"

なんだこれは・・・。私は、誰からもそんなことを言われるとは思ってもいませんでした!?

あなたの投稿は、状況にもっと光を当ててくれました - 感謝します。

このフォーラムは本当に面白いです...このフォーラムは本当に面白いですね。私は単に私が正しくEMAのと交差するバーを識別する方法としていくつかの明確化を望んでいた...

なんてこった....

 

raptorの回答を読むと、まさにあなたが作った問題を教えてくれているようです。

価格はdouble 変数として格納されます(例:1.12345

iHighest関数は、1、2、-100などの整数(int)を返します。

あなたが何をしようとしているのかわかりませんが、iHighest関数はおそらくあなたが使いたい関数ではありません。

メタエディタでiHighestをクリックし、F1キーを押せば、それが整数を返すことがわかります。

あなたの混乱の原因がわかりません。もしint変数とdouble変数の違いがわからないなら、重要な基礎知識が欠けています。つまり、あなたは歩く前に走ろうとしていて、誰かに運んでもらいたいのでしょう :/。

EDIT: 他の人に聞く前に自分でトラブルシューティングをしなければならないとは思っていなかったのですか!

 

複数の移動平均線が同時にクロス することはありません。

なぜ二重投稿しているのですか?あなたの質問には以前に回答して います。

すべての移動平均が正しい順序で並んでいた最も古いバーを見つけてください。

int DIR = 0;
for(int iBar = 0; iBar < Bar; iBar++){
   double MA20 = ... iBar), 
           MA5 = ... iBar);
          :
   if(     MA20 > MA5 && MA5 > ...) DIR = -1;
   else if(MA20 < MA5 && MA5 < ...) DIR = +1; // All fanning up.
   else if (DIR != 0){ iBar--; break; }       // Last one was cross.
}
 

intとdoubleの違いはわかるのですが・・・。

If文が真になった後、私はMAの間隔が離れているポイントで交差したバーを見つけたいのです。もし、私が使用した場合、私は考えました。

もし、「If」文の後に「triggerBarTime = Time[1];」を使えば、iBarShiftと一緒にtriggerBarTimeを使って、私が興味を持っている範囲の最初のバーに固定することができるのでは?

それから、iHighestを使用して、この情報をintに変換し、私の注文関数(Buy_Price)に使用することができるでしょうか?

 

intとdoubleの違いはわかっても、bar number (int)とprice (double)の違いはわかっていないようです。

iHighestでは、datetimeをバーナンバー(int)に変換できますが、OrderSendは価格(double)しか受け取らないので、9で注文を出すのは意味がありません。

 

あ!ごちそうさまでした。

どうもありがとうございました :)本当にありがとうございます!

私は、誰かに何かをしてもらうことを期待するような言い方をしたつもりはありません。ただ、ヘルプについての説明(すべてにおいてF1を押すことは、私にとって必ずしも明確ではありません。

理由: