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

 
Imminence:

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

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

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


Alertで確認したところ、テスターではなぜか最後のティックの計算から最大値を表示するのですが、このような値が表示されます。

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


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

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


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

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

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

は、何らかの理由で数本のロウソクに入っている可能性があります。


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

1.コードには、最後の20本のバーに関する記述はありませんでした。

2.新しいバーの最初のティックを決定する方法

3.ティックかどうかを確認せずに注文を終了 するにはどうしたらよいですか?

OnTickを使わずにOnTimerで動作させる必要があります。 1秒間隔のタイマーを設定し、その中の時間をチェックします。タイマーはティックに依存しない。

/// Определяет начало нового бара
bool NewBar()
{
    static datetime lastbar = 0;
    datetime curbar = iTime(Symbol(), PERIOD_M30, 0);
    if(lastbar!=curbar)
    {
        lastbar=curbar;
        return (true);
    }
    return(false);
}
 
Leanid Aladzyeu:

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

唾を吐きかける。

もちろん、2次元の配列の3番目の要素にアクセスすると、吐き出されます - mas[2]++...

void Oher(int Mag,string Symb, int &mas[2])
..............
...........

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

Alexey Volchanskiy:
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

冗談のような話です。これで、行末にコメントが追加されました...。と表示され、テキストが右側に逃げてしまいます。;-)

 

こんばんは。天底と金的のクロスで簡単なEAを書こうとして います。以下はそのコードです。

void OnTick()

void OnTick()

{

TradeSignal_20()。

}


int TradeSignal_20()

{

int sig=0;


if(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Symbol(),Period(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb)。

return(0)です。

}

さもなくば

{

if (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0); // TENKANSEN_LINE

if (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0); // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

//--- 状態を確認し、sig に値を設定する。

if(ich1_buffer[1]>ich2_buffer[1]) sig=1;

else if(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

でなければ sig=0;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

アラート(Symbol()+": purchase");

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

アラート(Symbol()+": Sale");

//--- リターン・トレード・シグナル

を返す(sig)。

}

//+------------------------------------------------------------------+

アラートが常に呼び出されるのではなく、一度だけ呼び出されるようにするにはどうしたらよいですか?

 
Alexey Volchanskiy:

1.コードに最後の20本のバーについて何も書かれていないのですが、詳細を教えてください。

2.新しいバーの最初のティックを決定する方法

3.チェックが入っているかどうかに関わらず、取引を終了するにはどうしたらよいですか?

OnTickを使わずにOnTimerで動作させ、1秒間隔のタイマーを設定し、その中で時間を確認する必要があります。タイマーはダニの到来に依存しない。

ここで、終値と 過去20本のバーの最大値を比較するにはどうしたらよいでしょうか。そして、最後の価格が過去20本のバーの最大価格と同じかそれ以上であれば、オープンのシグナルがあります。
  

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


   
  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() );
      } 
  }
 
first_may:

こんばんは。天底と金的のクロスで簡単なEAを書こうとして います。以下はそのコードです。

void OnTick()

void OnTick()

{

TradeSignal_20()。

アラートが常に呼び出されるのではなく、一度だけ呼び出されるようにするにはどうしたらよいですか?
SRCボタンは押せないのですか?
 
Imminence:
ここで、終値と 過去20本のバーの最大値を比較するにはどうしたらよいでしょうか。そして、最後の価格が過去20本のバーの最大値と同じかそれ以上であれば、オープンのシグナルがあります。
コードを見てみましょう
double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
***********

ゼロバー、つまり現在のバーを参照することが問題なのだと思います。新しいバーの始まりを定義し、新しいバーの最初のティックでのみすべての比較を実行する必要があります(前回の回答で説明しました)。そして、インデックスを変更する。最後に閉じたバーがiHighestにないことを確認する必要があります。そして今、あなたは、すべてのティックで形成されている現在のバーの参照を持っている、結果は最も奇妙なものになります。

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

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy:
のコードを見てみましょう。

ゼロバー、つまり現在のバーを参照していることが問題なのだと思います。新しいバーの開始を定義する必要があります。私は前の返信でそれを引用し、新しいバーの最初のティックにのみすべての比較を行います。そして、インデックスを変更する。最後に閉じたバーがiHighestにないことを確認する必要があります。そして今、あなたは、すべてのティックで形成されている現在のバーの参照を持っている、結果は最も奇妙なものになります。

ありがとうございます、役に立ったようです :) まったく同じことをしてもうまくいかなかったのに...

OnTimer()をアドバイスされましたが、なぜか協力してくれません。ヘルプをすべて勉強しても、わかりやすい説明や例が見つからず、困ってしまいました。

つまり、このつまらないコードは、すべてリファレンスに指定されているにもかかわらず、実行されないのです...。このプログラムをググると、OnTimer()がテストでは動作しないらしいということがわかりました。

モードです。mql5でこの瞬間はなくなったようですが。理解するのに役立つ :)ありがとうございます。

int OnInit()
  {
//---
  bool  Timer = EventSetTimer(1);
  if(Timer != TRUE)
  Print(GetLastError()); 
//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();   
  }
  
void OnTimer()
{
Print("It works");
}  
  
 

Imminence:

このプログラムをググってみると、テストモードではOnTimer()が動作しないらしいということに遭遇しました。mql5で解決済みです。理解できるように助けてください)ありがとうございます。

そうですね、テスターのMT4ではタイマーは動作しませんし、文書化もされていませんねservicedeskに手紙を 出したら、絶対にやらないって言われたよ。OnTickでOnTimerを呼び出すことで抜けました。タイマーを1秒にセットしています。

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

MqlDateTime     TimeCurrStruct;

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

そのため、テスターでは、刻みが1回/秒以上来る場合は、余分なものを飛ばし、少ない場合は、1秒の時間倍数を発生させるようにしています。この時間はTimeCurrStruct構造体にあり、私のメインクラスはどのモードでもこの構造体からしか時間を取りません。私見ですが、このバグへの対処はこれしかないと思います。以下は、不要なものを削除し、肉だけとした機能です ))

void OnTimer()
{
    string msg;
    if(!IsRunOnTester())
    {
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);    // основной метод робота, в него передается структура со временем
    }
    else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}




 
Alexey Volchanskiy:
SRCボタンは押せないのですか?
意味がよくわからないのですが?
理由: