[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 706

 

は、矢印の指標を作って いた。神の思し召しで、私はいくつかのものを作り、一つや二つは学んだのです。そこで、この2つを組み合わせて、1つのものを作ることにしました。アイデアの本質:MACDを持って、+と-で一定のレベルを設定します。MACDがこれらのレベルの背後にある場合(+と-の両方)、買いと売りの矢印が表示されます。エラーもなくコンパイルできているようですが、しかし、そううまくはいかないようです......。

//+------------------------------------------------------------------+
//|                                               Indicator_MACD.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       Fast_EMA=8;
extern int       Slow_EMA=34;
extern double    N = 0.0015;
extern int       A = 10;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,Fast_EMA,Slow_EMA,1,1,MODE_MAIN, i);
      if ((MACD[i]>MACD[i+1]) || (MACD[i]<MACD[i+1]))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

これはワーキングインジケータです

 

そして、こんなものが出てきました......。

//+------------------------------------------------------------------+
//|                                           ndicator_MACD_OsMA.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       F_EMA=8;      // пар-ры MACD
extern int       S_EMA=34;     // пар-ры MACD
extern double    N = 0.0015;   // контр. линия
extern int       A = 10;       // расстояние от бара
extern int       Fast_EMA=12;  // пар-ры OsMA
extern int       Slow_EMA=26;  // пар-ры OsMA
extern int       Signal_EMA=9; // пар-ры OsMA
extern double    Z = 0.00005;  // контр. линия
extern int       B = 10;       // расстояние от бара

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];
double OsMA[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(2,OsMA);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,F_EMA,S_EMA,1,1,MODE_MAIN, i);
      OsMA[i]=iOsMA(NULL,0,Fast_EMA,Slow_EMA,Signal_EMA,PRICE_OPEN,i);
      if (((MACD[i]>MACD[i+1])||(MACD[i]<MACD[i+1]))&&((OsMA[i]>OsMA[i+1])||(OsMA[i]<OsMA[i+1])))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point;
       if( OsMA[i] <-Z) ExtMapBuffer2[i] = Low[i] -B*Point;
       if( OsMA[i] > Z) ExtMapBuffer1[i] = High[i]+B*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

コードがおかしいと感じるが、それが何かわからない..........................。を助けるのは、間違っている...。 :-))

 
なぜ、最も基本的なペアである EUR/USD や USD/JPY が Quote Archive にないのでしょうか?もしかして、私のやり方が悪いのでしょうか?
 

こんにちは!KimIVから 機能を提供してくれたArtemに感謝します。

たぶん誰かが知っている:TakeProfitLastClosePos() 関数の1つ(最後のクローズポジションの TakeProfit価格または-1を返す)は、 小数点以下4桁 TakeProfit 値を返し 、私のDCは小数点以下5桁(EURUSDペア)を与えます。 最後に決済したポジションの TakeProfitの 値と次の注文を出す 価格が直接関係しているため、次の注文を出すことができません。この状況を打破するために、力を貸してください。ありがとうございました!!!

double TakeProfitLastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 
dimon74:

こんにちは!KimIVから 機能を提供してくれたArtemに感謝します。

たぶん誰かが知っている:TakeProfitLastClosePos() 関数の1つ(最後のクローズポジションのTakeProfit価格または-1を返す)は、 小数点以下4桁 TakeProfit 値を返し 、私のDCは小数点以下5桁(EURUSDペア)を与えます。 最後に決済したポジションの TakeProfitの 値と次の注文を出す 価格が直接関係しているため、次の注文を出すことができません。この状況を打破するために、力を貸してください。ありがとうございました!!!


実際には、この関数は小数点以下のすべての有効数字を含んだ値を返します。小数点以下8桁でもただ、デフォルトでは4桁で出力されます。しかし、あらかじめDoubleToStr()を使っておくと
 
drknn:
OrderSend(通貨ペア名......その他パラメータ......)


多通貨EAのコードを解決する手助けが必要です。1つのEAが動作し、任意の通貨ペアで取引を開始する必要があります。

CodeBaseで多通貨EAを掘って みたが、どこがどうなっていて、なぜそうなるのかがわからない。

多通貨EAのコードが分からないとStrategy Testerで確認できません(( このコードか他のコードに基づいて、私のEAがすべてのペアで取引できるように、何がどこに行くべきか、なぜそうなるのかを説明してください。 よくわからないままコードを切れば動くのですが、やはり実装がよくわからず、また相談することになりそうです。

extern string Instrument = "EURUSD";
extern double Lots = 0.1;
extern int    TakeProfit = 50;
extern int    TrailingStop = 0;
extern int    StopLoss = 50;
extern int    FirstOpenLevel = 5;
extern int    LastOpenLevel = 20;
extern int    Slope = 2;
extern int    CloseLevel = 20;
 

int start()
{
   double MacdCurrent, MacdPrevious, SignalCurrent, SignalPrevious;
   int    i, total, p1, p2, p3, p4, p5, p6, p7, p8, p9;
  
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
      
   p1=0; p2=0; p3=0; p4=0; p5=0; p6=0; p7=0; p8=0; p9=0;
      
     OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
      
     OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(2,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(3,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(4,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
   
   total=OrdersTotal();
   for(i=0;i<total;i++)
   {
     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        
     if(OrderSymbol()==Instrument)
      {
         if(OrderType()==OP_BUY) 
          {
            if(MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent>CloseLevel*0.1*Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                 return(0);
                }
            if(TrailingStop>0)  
              {      
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
          if(OrderType()==OP_SELL)
           {
            if(SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent>CloseLevel*0.1*Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
            if(TrailingStop>0)  
              {         
               if(OrderOpenPrice()-Ask>Point*TrailingStop)
                 {
                  if(OrderStopLoss()>Ask+Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   
   total=OrdersTotal();  
   if(total<5)
   {
     if((Instrument=="EURUSD" && p1<1) || (Instrument=="GBPUSD" && p2<1) || 
        (Instrument=="USDCHF" && p3<1) || (Instrument=="USDJPY" && p4<1) ||
        (Instrument=="EURCHF" && p5<1) || (Instrument=="EURGBP" && p6<1) ||
        (Instrument=="AUDUSD" && p7<1) || (Instrument=="USDCAD" && p8<1) ||
        (Instrument=="EURJPY" && p9<1)) 
      {
        if(MacdCurrent<0 && MacdCurrent-SignalCurrent>SignalCurrent*FirstOpenLevel*(-0.01)
           && MacdCurrent-SignalCurrent<SignalCurrent*LastOpenLevel*(-0.01)
           && MacdCurrent-MacdPrevious>MacdPrevious*Slope*(-0.01)
           && MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent<(CloseLevel-10)*0.1*Point)  
          {
           OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
           return(0); 
          }   
      
         if(MacdCurrent>0 && SignalCurrent-MacdCurrent>SignalCurrent*FirstOpenLevel*0.01
            && SignalCurrent-MacdCurrent<SignalCurrent*LastOpenLevel*0.01
            && MacdPrevious-MacdCurrent>MacdPrevious*Slope*0.01
            && SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent<(CloseLevel-10)*0.1*Point)
          {
           OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
           return(0); 
          }
       }
    }
}
 
igrok2008:

そして、こんなものが出てきました......。
コードに何か間違った匂いがするんだけど、何だろう............。

4つ目のインジケータ配列が追加されましたが、コードにはまだ3つあります。以下は、微調整したコードです。
int init(){
//---- indicators
   IndicatorBuffers(4);   
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);   
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);   
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(3,OsMA);   
//----
}
 
Infinity:
多通貨EAのコードの理解を助けてほしい。

CodeBaseで多通貨EAを掘ったのですが、どこがどうなっていて、なぜそうなったのかがわかりません。
コードが分からないとStrategy Testerで確認できません。 (( 私のEAが全てのペアで取引できるように、このコードや他のコードに基づいて、何がどこでなぜ必要なのか説明してください。コードは理解できないが、動くかもしれないが、やはり実装は理解できないので、また相談させてもらう。

このコードは、それが接続されているペアにのみトランザクションを開くように、あなたに合わない、それはラインで見ることができます。

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);

関数Symbol()は、現在のペアを返す。したがって、他の通貨ペアで開設する場合は、この機能の代わりに、希望の金融商品名を入力するだけでよい。

 
ToLik_SRGV:

このコードは、それが接続されているペアでしか取引を開始しないので、あなたに適していません、これはラインから見ることができます。

関数Symbol()は、現在のペアを返す。したがって、他の通貨ペアで取引を行う場合は、この機能の代わりに、必要な金融商品名を入力するだけでよいのです。


そんなに簡単なことではありません。また、Pointを 正しい値に変更し、Askする必要があります。そしてBidも。
 
ToLik_SRGV:

このコードは、それが接続されているペアでしか取引を開始しないので、あなたに適していません、これはラインから見ることができます。

関数Symbol()は、現在のペアを返す。したがって、他の通貨ペアで取引を行う場合は、この機能の代わりに、必要な金融商品名を入力してください。


そういうことです。私のExpert Advisorは異なる通貨ペアからシグナルを受信し、私の注文のSymbol() の代わりに、通貨ペアの値を変数に割り当てます。つまり、シグナルがEURから来る場合、それはEURUSDで、円から来る場合、USDJPYですがEAを含めて、それはすべてのシグナルを見て、それが立っている通貨だけを開くことができます。

以下のサンプルコードでは、このようにしています。

//---- ранее на обработке переменная Symb получает значение валютной пары с которой пришол сигнал
// далее я сравниваю и пытаюсь открыть ордер
 if (Symb == "GBPUSD") {val ="GBPUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "EURUSD") {val ="EURUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "USDJPY") {val ="USDJPY"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}