MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 33

 
spoiltboy:

よかったです。エラーの発生箇所を教えてください。

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

すべてうまくいき、maxpr1の値段で注文する。

それなら、同じようにminpr1価格でやりたい。

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

130エラー(停止位置が違う)。私は何を間違えているのだろう?


保留中の注文を出すとき、始値は市場に近すぎてはいけませんまた、MarketInfo()関数のMODE_STOPLEVELパラメータを使用して、現在の市場価格からの保留価格の最小距離(ポイント)を取得することも可能です。保留中の注文の建値が正しくない場合、エラー 130 (ERR_INVALID_STOPS) が発生します。

 
Alekseu Fedotov:
いや、そうじゃなくて、ギャップがあるんです。また、買い保留を変更して、同じチャートでテストしてみましたが、同じような間違いがありました。
 
spoiltboy:
いや、そうじゃなくて、ギャップがあるんです。さらに、買い保留を変更し、同じチャートでテストしてみましたが、同じエラーでした。

隙間は隙間でも、おそらく以下をすべて読んでいないはずです。

................... 保留中の注文の 建値が正しくない場合、エラー 130 (ERR_INVALID_STOPS) ....................が発生します。

つまり、OP_SELLLIMITを市場価格より低く設定しようとしている

 
Alekseu Fedotov:

隙間は隙間でも、おそらく以下をすべて読んでいないはずです。

................... 保留中の注文の 建値が正しくない場合、エラー 130 (ERR_INVALID_STOPS) ....................が発生します。

OP_SELLLIMITを市場価格より低く設定しようとしている

ありがとうございます。
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

  for(int i2=total-1; i2>=0; i2--)
     if(OrderSelect(i2, SELECT_BY_POS))
         if(OrderSymbol()==Symbol()      )
         if (OrderMagicNumber()==Magic)
      {
      if (OrderType()==OP_BUY)
      {
     if (sig2==1)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
      if (OrderType()==OP_SELL)
      {
     if (sig2==2)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_BUYSTOP)
      {
    
     if (sig2==2&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
    
     //if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_SELLSTOP)
      {
  
     if (sig2==1&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
  
     //if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
      
      }
      
      }

    
  
  }
//+------------------------------------------------------------------+
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;}.// 売りストップ

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;}.// 買いストップ

未決済の取引を単独で決済するシグナルはありません。

 
Movlat Baghiyev:
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;}.// 売りストップ

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;}.// 買いストップ

取引を終了するためのシグナルはありません。

ゼロバーでは、信号が「ちらつき」、これはポストファクタムでは見えません。テスターのすべてのティックでビジュアライゼーションを実行すると、質問が消えます。
 
Vitalie Postolache:
小節ゼロでは信号が「ちらつき」、これは事後的には見えません。テスターのすべての目盛りでビジュアライゼーションを実行すると、質問が消えます。
注文がトリガーされると、トレードが始まり、新しいローソク 足が表示され、逆シグナルがなければすぐにクローズします。 だから、トレードをクローズするコードの一部をお渡ししたのです。
 
Movlat Baghiyev:
これは問題ではありません。 注文がトリガーされると取引が開始され、新しいローソク 足が表示され、逆信号がなければすぐに閉じられます。 だから、取引を閉じるためのコードの断片を提供したのです。
シグナルは一定なので、変数"sig " をNULLにすると、次のクロスで再び値を取り、すべてのアクションが完了した後に再度NULLにする必要があります。または、アップクロスがあった場合、次はダウンクロスになるはずで、ダウンクロスがない場合は、リバースクロスがあるまですべての信号を無視するというフラグを置くことができます
 

こんにちは。

何が問題なのか、教えてください。

M1期間では指標線 がレベル20を超え、M5期間では指標線がレベル50を超えている場合に設定されるはずです。

M5のラインが設定値である50を下回っていても、なぜかマークが設定される。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
mila.com:

こんにちは。

何が問題なのか、教えてください。

M1期間では指標線 がレベル20を超え、M5期間では指標線がレベル50を超えている場合に設定されるはずです。

M5の線が設定値である50を下回っていても、なぜか標識が設定されている。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

あなたのサイクルは奇妙です。不思議ですね。

//+------------------------------------------------------------------+
   if(rates_total<xxx) return(0);         // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
   int limit=rates_total-prev_calculated;
   if(limit>1) {                          // limit больше 1 в том случае, когда в истории произошли изменения
      limit=rates_total-1;                // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
      // тут проводим действия когда нужно пересчитать всю историю
      }
//---
   for(int i=limit; i>=0; i--) {
      // основной цикл индикатора
      }
//+------------------------------------------------------------------+

なぜ1つ以上のチェックに制限をかけるのか。例えば、履歴が読み込まれ、その差は1より大きくなる。全てが正常な場合、差分rates_total-prev_calculatedは0か1のどちらかになります。
0 - 新しいティックが来て、新しいバーが形成され始めていない状態です。
1 - 新しいティックが来て、新しいバーが形成され始めています。

インジケーターの全体像を見せてください - 何が問題なのか見てみましょう。