EA/インジケーターからのティックのエミュレーション - ページ 3

 
Meat:

ええ、何が悪いのかはっきりしませんが...それならこれを試してみてください。インポートセクションに #import "user32.dll" という関数を追加します。

CallWindowProcA(int lpPrevWndFunc[], int hWnd, int Msg, int wParam, int lParam);

そして、SetMyTimer関数の最後にCallWindowProcA(code,0,0,0)という行を追加してください。

そして、並行して動作するいくつかのインジケータで、この瞬間にティックが生成されているかどうかをチェックします。

さて、何かが変わったようで、ログはこのようになっています。
10:42:52 test EURUSD,H1: ロードに成功しました。
10:42:54 test EURUSD,H1: function 'CallWindowProcA' call from dll 'user32.dll'critical error c0000005 at 02C310A8.H1: function 'CallWindowProcA' call from dll 'user32.dll'critical error c0000005 at 02C310A8.
10:42:54 test EURUSD,H1: 初期化。

ダニはどこだ?;)

 
Meat:

Zhunko さん、まあ、すべてが非標準(独自のログ、インディケータの独自実装など)なら、なぜこんな話を始めるのでしょうか。 実は、MT4に特化した作業の議論であって、独自の開発とは関係ないのですが。

最初の投稿で、私のコードは外部リンクなしで 行うタスク、つまりシステムライブラリのみを使用する自給自足のExpert Advisor/Indicatorを実装する場合に役立つと明確に指摘しました。 そして、あなたが独自の開発を使用している場合、それはあなたに適用されるものではありません。

また、一般的に、ログを散らかさない方が楽なのに、なぜ「仕事帰りに手動で掃除」しなければならないのか、理解できない。結局、私が理解した限りでは、DLLで開発したものを実装しているのですね。それなら、私がここで提案したように、同じタイマーをそこに設定することを妨げるものは何でしょう。でも、なぜかあなたはタンバリンと踊ったり、ログを掃除したりすることを好む。 私のコードがあなたを悩ませているのに、あなたは毎日ログを掃除するのが面倒なんですね :)

ログが埋まるのは履歴を汲み上げた後だ。水曜と土曜に開催。自動クリーニングのため、内容を忘れてしまった。

チャートの自律的な更新は、以前から行われていました。ここに 実装されています。どのプログラムからでも一度だけ関数を実行すれば、あとは何もする必要がありません。すべてのMQL4プログラムをアンロードしても、更新は継続され、チャートの開閉が監視されます。

あなたのコードの代替は、私が提案したものではありません。お客様の課題をもとに、シンプルに解決します。1行のコードは、あなたのコードよりずっとシンプルです。毎日、丸太を掃除する必要はないのです。週末のみ。それ以外は、このコードは必要ありません。合理的なんです。とにかくログをきれいにすることです。だから、これが理由ではありません。

======================

あなたのコードを実行しました。Window 7では動作しません。

AddBytes()関数を廃止しても良いですか?このように配列を初期化します。

  int code[7] = {0x558BEC6A, 0x16A0268, 0, 0, 0, 0, 0x33C05DC3};
  code[2] = MT4InternalMsg;
  code[3] = 0x68000000 + (hWnd >> 8);
  code[4] = (hWnd << 24) + 0x00B80000 + (PostMsgAddr >> 16);
  code[5] = (PostMsgAddr << 16) + 0x0000FFD0;
より短くなりました。それでも、一回きりの仕事です。
 
Zhunko:

履歴が入れ替わった後にしかログが出ない。水曜日と土曜日に行われます。自動クリーニングのため、内容を忘れてしまった。

チャートの自律的な更新は、ずいぶん前に行われました。ここに 実装されています。どのプログラムからでも一度だけ関数を実行すれば、あとは何もする必要がありません。すべてのMQL4プログラムをアンロードしても、更新は継続され、チャートの開閉が監視されます。

あなたのコードの代替は、私が提案したものではありません。お客様の課題をもとに、シンプルに解決します。1行のコードは、あなたのコードよりずっとシンプルです。毎日、丸太を掃除する必要はないのです。週末のみ。それ以外は、このコードは必要ありません。合理的なんです。とにかくログをきれいにすることです。だから、これが理由ではありません。

======================

あなたのコードを実行しました。Window 7では動作しません。

AddBytes()関数を廃止しても良いですか?このように配列を初期化します。

もっと短くなりますよ。それでも、一回きりの仕事です。

ええ、もちろん、私の掲載したコードは、意味を理解するためのソースコードに過ぎず、一方で、パックした形で使う方が便利なのですが・・・。しかし、結論から言うと、コンパイルするのが早すぎて、なぜか動きません :) XPでも7でも問題なく動くのですが、1時間くらい動かしても何もクラッシュしません。ちょっと不思議な感じですが...。

1行のコードは、あなたのコードよりずっと簡単です。毎日、丸太を掃除する必要はないのです。週末のみ。それ以外は、このコードは必要ありません。合理的なんです。

伐採清掃員」が同時に働いている場合、つまりそこに自分のキッチンがある場合は、個人的には重要ではないかもしれませんが、一般的なケースの話となります。このようなことをしない普通のユーザーを想像してみてください。 その場合、あなたのインジケータをうまく使うために「ログクリーナ」が必要になります。 例えば、以下のようなものです。そして、あなたはそれが私のコードのサイズよりもはるかに大きいことを認めなければなりません ;) だから、私はあなたが合理性と簡潔さについて間違っていると思います。特に、あなたが提案するように、私のコードをパックした形で取るなら、です。もちろん、一筋縄ではいきませんが、他のアドオンを必要としない、つまり完成された製品です。

ログはとにかくきれいにすること。

詰まらないのに、なぜ掃除しなければならないのか?

 

アレクセイ、クリーナーは必ずしも自動でない場合があります。例えば、フォルダーを右クリックして、「フォルダーのクリア」を選択します。週末に実験した後、行ってください。

1年間で365個のファイルがEAやログに蓄積されます。その数、730ファイル。クリーニングしてはいけないのですか?そう言われると、不思議な気がします。何もしないから詰まるのではありません。丸太は毎日作業していると、ずいぶん大きくなるものです。

 
Zhunko:

アレクセイ、クリーナーは必ずしも自動でない場合があります。例えば、フォルダーを右クリックして、「フォルダーのクリア」を選択します。週末に実験した後、行ってください。

1年間で365個のファイルがEAやログに蓄積されます。その数、730ファイル。クリーニングしてはいけないのですか?そう言われると、不思議な気がします。何もしないから詰まるのではありません。丸太は毎日作業していると、ずいぶん大きくなるものです。

まあ、原則的にはそうなのですが、実験後は通常洗浄する必要があるのは同意します。ただ、実験のためではなく、インジケータは動くために作っているわけですから、デバッグしたインジケータが動作中もログファイルを詰まらせるようでは、正しいとは言えません。

古いログの削除といえば、個人の好みの問題ですが、例えば、1年前のログからある情報を探し出すことがありました。だから、削除はしない。実験ではなく、取引に直接関係するログという意味です。

 
Meat:

まあ、原則的にはそうなんですが、実験後に洗浄が必要なのが普通なのは同意です。しかし、私たちは実験だけの話をしているのではありません。結局のところ、インジケータは機能するために作られるのであって、実験のために 作られるのではないのです。ですから、デバッグされたインジケータが、その作業の過程でログを詰まらせ続けるのであれば、それはもう間違いです。

だから、そういうギミックは週末にしか必要ないってことです。あとは必要ない。
 

一般的に、ダニの発生は 平日も必要だと言われています。シンボルのクォートのみを使用するExpert Advisor/Indicatorを検討しているようですが、どのようにすればよいのでしょうか?もちろん、流動的なシンボル、例えばEURUSDのように、ティックが頻繁に来るようなシンボルで実行することもできます...しかし、万能ではないし、あまり便利ではないかもしれません。

 

いずれにせよ、ティックが来る前に結果を確認したいとき。

つまり、-研究目的のために。

 

配列はローカルにではなく、グローバルに宣言する必要があります。

訂正版を掲載します。同時にコードも短くしました。Zhunkoが提案した変形は、これより3行短いとはいえ、アルゴリズムが複雑すぎて理解するのに不便だった)。だから、コード削減のために極端なことはしない方がいいと思います。

#property indicator_chart_window

#import "user32.dll"
  int   RegisterWindowMessageA(string lpString);
  int   SetTimer(int hWnd,int nIDEvent,int uElapse,int& lpTimerFunc[]);
  bool  KillTimer(int hWnd,int uIDEvent);
#import "kernel32.dll"
  int   GetModuleHandleA(string lpModuleName);
  int   GetProcAddress(int hModule,string lpProcName);
  
int TimerId=666;
int TimerCode[7];

//----------------------------------------------------------------------

int init()
{
  SetMyTimer(1000);  // интервал в миллисекундах
}
//----------------------------------------------------------------------

int deinit()
{
  KillMyTimer();
  Comment("");
}  

//+------------------------------------------------------------------+
//| program start function                                           |
//+------------------------------------------------------------------+
int start()
{
  static int n=0;
  n++; 
  Comment("tick:  ",n);
  PlaySound("tick.wav");
}
//-------------------------------------------------------------------

int SetMyTimer(int interval)
{    
  int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message");
  int hWnd= WindowHandle(Symbol(),Period());
  int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA");
  if (PostMsgAddr==0) return(0);
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret;    
  int value[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC3 };
  int len[]=  { 1,    1,   1,    1,   1,  1,   1,  1,   4,    1,   4,    1,   4,    1,   1,    1,    1    };
  value[8]=MT4InternMsg;  value[10]=hWnd;  value[12]=PostMsgAddr; 
  int byte=0;
  for (int i=0; i<ArraySize(value); i++)
    for (int j=0;  j<len[i];  j++, byte++)
      TimerCode[byte/4] += (value[i]>>(8*j)&0xFF) <<(byte%4*8);
  
  return ( SetTimer(hWnd, TimerId, interval, TimerCode) );
}

//---------------------------------------------------

bool KillMyTimer()
{
  return( KillTimer(WindowHandle(Symbol(),Period()), TimerId) );
}
 
Meat:

一般的に、ダニの発生は平日も必要だと言われています。シンボルの引用符のみを使用するExpert Advisor/Indicatorを考えているようですが、どうすればよいのでしょうか?もちろん、例えばEURUSDのようなティックが頻繁に来るような流動的なシンボルで実行することもできます...しかし、万能ではないし、あまり便利ではないかもしれません。

一例だけ?

書いている限り、使っている限り、週末を除いては、必要なかった。

Expert Advisor + インジケータ。Expert Advisorを「フリーズ」させることで解決します。その結果は、あなたと同じです。データを時間通りに受信するためには、サーバーの時間 変化に対応すればよい。その際、WinAPIは必要ありません。

唯一必要なケースは、週末にExpert Advisorを起動するときです。それすらも、上にあげたセリフで実装できるのです。Expert Advisorのみ。

理由: