初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 411

 
Leanid Aladzyeu:

アレイの勉強を開始 .

私は、配列、3つの配列= 0買い、1=売り、2=買いおよび売りの合計取引でプロ注文関数を書きました。

そして、( 最初の条件 && 配列 [0] == 0 )なら買いを入れるという条件を書きました。

そして、もし( 最初の条件 && 配列 [1]== 0) ならば、売りポジションを建てることになります。

しかし、テスターがエラーを投げてテストが止まってしまうのですが、何が問題なのでしょうか?( エラー " 配列の終了 " )

アドレスしているインデックスが配列レイアウトの外にあることを意味します。例えば、array[ 3 ]の場合、0から2までの項目のみをアドレス指定することができます。コードを確認する

もうひとつの可能性は、(ArrayResize() で)配列を分割せずに、その一部の要素にアクセスしようとした場合です。

 
コード...
void Oher(int Mag,string Symb, int &mas[2])
{
ArrayInitialize( mas,0);

int tip;
int ticket3 =-1;
  for (int pos=OrdersTotal()-1; pos>=0; pos--)
     {
     if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
          switch(tip)
              {
              case 0:mas[0]++; mas [2]++;break;// 0 покупка
              case 1:mas[1]++; mas [2]++;break;// 1 продажа
              }
          }
          continue;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu:
コード...
テスターには、どの行で、どの位置でエラーが発生したかが表示されているはずですので、ご自身で調べてみてください。
 
Tapochun:
テスターには、どの行で、どの位置でエラーが発生したかが表示されているはずですので、ご自身で調べてみてください。

o_oops ターミナルもエラー箇所を突くとは知りませんでした、初めてクリティカルなエラー に遭遇しました。

   case 1:mas[1]++; mas [2]++;break;// 1 продажа

唾を吐きかける。

 
修正しました。2つの配列の合計で3つ必要でした。配列の初期 化と関数の中で数字を+1してうまくいきました)
 

インジケーターの動作を確認する方法を教えてください。

EAが新しいバーを 形成するとき、インジケータを呼び出しますが、インジケータはこの時点でデータを持っておらず、私は前のバーのデータを取得します(それは計算する時間がありませんでした)。

この問題を回避する方法さらに、Strategy Testerでは、すべてOKです。デモでは問題なく表示されるか、全く表示されないかのどちらかです

それはそれ、関係ない。解決済み。

 

こんにちは、初心者の悩みがあるのですが・・・。

最後のバーの終値とある期間の高値・安値を比較するシステムがうまくいきません、例えば

最後の20小節私は何を間違えているのだろう?

extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55)
if(Minute() == 29 || Minute() == 59)
{     
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
}
}


Alertで確認したところ、テスターではなぜか一番最後のティックからの計算で最大値が出ますが、このような値が出てしまいます。

ティックと同じ回数なので、注文は開きません。


2つ目の問題は、次のバーが開くまでEAを待機させる方法です(30m周期)。 コントロールポイントを使用してテストした場合はすべてうまくいきますが、ティックを使用した場合は、次のようになります。

で、EAがストップロスで閉じた直後の同じバーで開く...。


また、ティックであるかどうかに関係なく、取引を終了するにはどうしたらよいでしょうか。 例えば、期間30mの場合、バーの終了5秒前(29.55, 59.55)に注文を終了したいのです。

その瞬間のすべてのデータをもとにこの段階での問題は、5秒以内にティックが発生しない場合、したがって、ノー

(理論的にはでたらめですが、現実には何らかの理由で次のティックが数本のローソク足で表示されることがあります。

は、何らかの理由で数本のキャンドルで判明することがあります。


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

コメントに協力してください。各バーには、コメントが生成されます。チックするたびに、既存のコメントにさらにテキストを追加したい。

コードを呼び出す。

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

新しいコメントを追加し、改行 するごとにテキストがスライドして表示されます。

出力する前に最後の数行を削除するようにするには?

 
ForTorg ZEVs:

コメントに協力してください。各バーには、コメントが生成されます。チックするごとに、既存のコメントにさらにテキストを追加したい。

コードを呼び出す。

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

新しいコメントを追加し、改行 するごとにテキストがスライドして表示されます。

出力する前に最後の数行を削除するようにするには?

Comment()を完全に置き換えるしかないようです。

そして結果的に、コメントの一部を刻々と変化させるためには、刻々とコメントを完全に変化させなければならない。

 
ForTorg ZEVs:

コメントに協力してください。各バーには、コメントが生成されます。チックするたびに、既存のコメントにさらにテキストを追加したい。

コードを呼び出す。

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

新しいコメントを追加し、改行 するごとにテキストがスライドして表示されます。

出力前に最後の数行を削除するようにするには?

コメント中に制御文字"˶‾‾‾"がありますが、これは改行文字です。削除すれば、複数行になることはないでしょう。
理由: