他の通貨ペアからbid/askをインポートする方法は? - ページ 5

 
HosseinKOGO:

以上、GBPAUD H4 2018.3.12丸一日でしたー。で、今回は最後まで飛ばさずにやりました。

印刷 機能は、印刷するものが多すぎると、一部のレポートが失われるかも?
もう一つの問題は、これら3つの楽器のティックが異なるミリ秒で出てくるので、GBPAUDでstart/OnTick関数を使うと、GBPAUDのティックが出るたびにstart関数が実行されるだけだからだと思います。もしそうなら、すべての商品のask/bid価格が正確に同じ時間に出てくるたびに、それは返されます。

データは問題なさそうですが・・・。

印刷機能についてはその通りです...。私のテストでも多くの欠落行が見られます。しかし、すべてをファイルに印刷すると、何も欠落していません。

各GBPAUDティックの時間は、他のペアの最新のティックを取得するために使用されます(同じ時間まで)ので、それは常に何かを返すでしょう、ゼロではありません。

私はこの関数をクラス内に置くことに決めました。添付ファイルを参照してください。EAと一緒にexpertフォルダに置いてください。自由に改造してください。

以下のサンプルは、その使い方の一例です(ハイライトされた行が重要です)。

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = {"GBPUSD","EURUSD"};
string allPairs[] = {};

int tickCount = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
      allPairs[i] = otherPairs[i-1];
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile(string sym, MqlTick &tick)
{
   int file = FileOpen("LogFile.log",FILE_WRITE|FILE_READ|FILE_TXT);
   FileSeek(file,0,SEEK_END);
   FileWrite(file, sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
   FileClose(file);
}

void printTick(string sym, MqlTick &tick)
{
   Print (sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
}

ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). この行がポイントです。もしこれがfalseを返したら、エラーメッセージをジャーナルで確認する必要があります。

ファイル:
TicksInfo.mqh  5 kb
 
Seng Joo Thio:

データは問題なさそうですが・・・。

印刷機能についてはその通りです...。私のテストでも多くの欠落行が見られます。しかし、すべてをファイルに印刷すると、何も欠落していません。

各GBPAUDティックの時間は、他のペアの最新のティックを取得するために使用されます(同じ時間まで)ので、それは常に何かを返すでしょう、ゼロではありません。

私はこの関数をクラス内に置くことに決めました。添付ファイルを参照してください。EAと一緒にexpertフォルダに置いてください。自由に改造してください。

以下のサンプルは、その使い方の一例です(ハイライトされた行が重要です)。

ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). この行がポイントです。falseを返した場合、エラーメッセージのジャーナルを確認する必要があります。

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

これらの行をすべて適切な場所にコピーしました。しかし、私はコードを理解していないので、SecondPairのAskとBidをAsk2,Bid2に入れ、同じことをThirdPairに入れる方法をアドバイスください。
これが私のグローバルエリアです。

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0;
.
.
.

そして、この部分は、コンパイル時に2つのエラーを返します。これらをどうすればいいのでしょうか?
'SecondPair' - 定数式が必要 MyEA!.mq4
'ThirdPair' - 定数式が必要 MyEA!.mq4

 
HosseinKOGO:

よろしくお願いします。

これらの行をすべて適切な場所にコピーしました。しかし、私はコードを理解していないので、SecondPairのAskとBidをAsk2、Bid2に入れ、ThirdPairにも同じことをする方法をアドバイスしてください。
これが私のグローバルエリアです。

そして、この部分は、コンパイル時に2つのエラーを返します。これらをどうすればいいのでしょうか?
'SecondPair' - 定数式が必要 MyEA!.mq4
'ThirdPair' - 定数式が必要 MyEA!.mq4

次に、allPairsと同じようにotherPairsを宣言します。そして、OnInitで、こうします。

ArrayResize(otherPairs,2);
otherPairs[0] = SecondPair;
otherPairs[1] = ThirdPair;

そして、Ask2, Bid2, Ask3, Bid3 に値を割り当てるには、OnTick で次のようにします。

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");
 
Seng Joo Thio:

そして、allPairsと同じようにotherPairsを宣言します。そして、OnInitで、こうします。

そして、Ask2, Bid2, Ask3, Bid3 に値を割り当てるには、OnTick で以下のようにします。

また、00が表示される :(
私のグローバルエリアです。

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0;
.
.
.

OnInit:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
   allPairs[i] = otherPairs[i-1];
   
   ArrayResize(otherPairs,2);
   otherPairs[0] = SecondPair;
   otherPairs[1] = ThirdPair;
.
.
.

OnDeinit:

   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);

OnTick:

   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");

ジャーナル
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4: GBPCADエラー
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4:GBPUSDエラー
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4: GBPAUD tick number 221179, at 2018.01.03 23:36:58 000 Ask = 1.72479 Bid = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4: === 現在、221179のティックを処理中です。



どこを間違えているのでしょうか?
レベル0のスキルで申し訳ないです :D

 
HosseinKOGO:

また00が表示される :(
私のグローバルエリア

OnInit:

OnDeinit:

OnTickです。

どこを間違えているのでしょうか?
私の技術レベルゼロで申し訳ないです :D

OnInit - 新しい3行は、すべての行の前に置く必要があります。
 
HosseinKOGO:

レベル0の技術で申し訳ないです :D

変数と関数、そして実験する意欲が大切です。
 
Seng Joo Thio:
OnInit - 新しい3行は、すべての行の前に置く必要があります。

私はそれをやりました。しかし、非常に奇妙なことに、これらの2つの余分なペアのためのタイマーは動作しません...。

2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPCAD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPUSD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPAUD tick number 370711, at 2018.01.05 11:11:24 000 Ask = 1.72644 Bid = 1.72624
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO:

やりましたよ。しかし、とても不思議なことに、その2組の余分なペアのタイマーが機能しないのです...。

実験が終わって、まだ原因がわからないようなら、eaの全体像を見せてください。今から8時間後くらいに見てみようかな :).あとは😴...。😂
 
  1. Seng Joo Thio: OnInit - 3つの新しい行は、すべての行の前に置かれるべきです。
    OnInit(またはロード時) では、まだ接続やチャートがない可能性があるので、価格やサーバー関連の関数を使おうとしないでください。
    1. 端末が起動します。
    2. インジケータ/EAをロード静的変数、グローバル変数が初期化される。(特定の順序に依存しないこと)。
    3. OnInitが 呼び出される。
    4. 指標の場合、履歴があればOnCalculateが 呼び出されます。
    5. パスワードの入力が必要な場合があり、サーバとの接続が始まります。
    6. 新しい履歴を受信すると、OnCalculateが 再び呼び出されます。
    7. 新しいティックが受信され、OnCalculate/OnTickが 呼び出されます。今TickValueTimeCurrent、アカウント情報と価格が有効である。

  2. MT4では。MT4の場合:現在のチャートが特定のペア/TFを参照していない限り、価格にアクセスする前に 4066/4073 エラーを処理する必要が あります。
    MQL4 EAでのダウンロード履歴 - MQL4 and MetaTrader 4 - MQL4プログラミングフォーラム
    修正済み

    リンク先の関数は、問題のシンボル/TFの隠しチャートを開き(まだ開いていない場合)、履歴を更新し、シンボルを一時的にマーケットウォッチに置きます(まだそこにない場合)ので、SymbolInfoDoubleシンボルSYMBOL_BID)またはMarketInfoシンボルMODE_BID)も最初の呼び出しではゼロを返さないようにします。

 
William Roeder:
  1. OnInit(またはロード時)には、まだ接続やチャートがない可能性があるので、価格やサーバー関連の関数を使用しようとしないでください。
    1. 端末が起動します。
    2. インジケータ/EAをロード静的変数、グローバル変数が初期化される。(特定の順序に依存しないこと)。
    3. OnInitが 呼び出される。
    4. 指標の場合、履歴があればOnCalculateが 呼び出されます。
    5. パスワードの入力が必要な場合があり、サーバとの接続が始まります。
    6. 新しい履歴を受信すると、OnCalculateが 再び呼び出されます。
    7. 新しいティックが受信され、OnCalculate/OnTickが 呼び出されます。今TickValueTimeCurrent、アカウント情報と価格が有効である。

  2. MT4では。MT4の場合:現在のチャートが特定のペア/TFを参照していない限り、価格にアクセスする前に 4066/4073 エラーを処理する必要が あります。
    MQL4 EAでのダウンロード履歴 - MQL4 and MetaTrader 4 - MQL4プログラミングフォーラム
    修正済み

    リンク先の関数は、問題のシンボル/TFの隠しチャートを開き(まだ開いていない場合)、履歴を更新し、シンボルを一時的にマーケットウォッチに配置します(まだそこにない場合)ので、SymbolInfoDoubleシンボルSYMBOL_BID)またはMarketInfoシンボルMODE_BID)も最初の呼び出しではゼロを返さないでしょう。

おっしゃるとおりです。でも、OnInitでやっていることは、シンボル名を格納するための配列の初期化と、独自のデータファイルを読み込むためのファイルハンドルの準備だけなので、心配はありません。MT4ストラテジーテスターは、他のシンボルのデータを照会すると常にゼロを返すからです(この動作は、人々がよく知っているOHLCデータの検索とは異なることに注意してください)。