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

 
expertboss さん、2008のサーバーって必要なんですか?私見ですが、2003の機能で十分ですし、リソースへの負荷が少ないので、より安価なハードウェアを選択することができます。
 
Meat:

この時計がエキスパート(インジケーターではない)であれば、単純にループしているだけなので、複数のシンボルにまたがって情報を得ることに問題はない。これは、先ほど書いた、Expert Advisorのティックについては、ループさせることができるので、実は大きな問題はない、ということです。しかし、インジケーターではこの数値は使えません。

OSが違うことについては、まだ謎のままです。上に書いたように、私のパソコンでは7で問題なく使えるのですが、他の人はなぜか使えないんですよね。おそらくアクセス権に関係するものだと思いますが...。

ちなみに、「置換ライブラリ」については、WinXP(2003)からuser32とkernel32のファイルを取り出し、Vista(2008)がインストールされているコンピュータのExpertslibrariesフォルダに貼り付けてみてください。うまくいったら?:)...どうでしょうね。

私はあなたの味方です、しかし、クロックに関しては、あなたの答えから判断すると、あなたは私の考えを理解していないようだ、私はコードで試してみる。

int init()

{

ObjectCreate("ServerTime",OBJ_LABEL, 0,0,0,0;)

ObjectSet("ServerTime", OBJPROP_CORNER, 3);

ObjectSet("ServerTime", OBJPROP_XDISTANCE, 10);

ObjectSet("ServerTime", OBJPROP_YDISTANCE, 37)を使用します。

ObjectSetText("ServerTime", "", 20, "Arial", Green)を使用します。

を返します。

}

int start()

{

ObjectSetText("ServerTime", TimeToStr( TimeCurrent(), TIME_SECONDS ));

...

を返します。

}

マーケットウォッチ」ウィンドウにシンボルが1つしかなく、それに対してチャートが作成されている場合、時刻と時刻の更新はチャートのティックと一致し、それに応じてExpert Advisorの動作も一致します。Market Watch" ウィンドウにいくつかのシンボルがある場合、"Market Watch : 22:59:58" ヘッダーに表示される小さな時計は、これらの時計がほとんど常に時を刻んでいます。 これらのすべての刻みを私のEAまたはEAが動作するウィンドウに追加して適用できれば""" というのが私の考えです。と、1組の見積もりだけでなく、たくさんの刻みをつけて終了します。

アレクサンダー

リソースをループさせたくない・・・。つまり、すべてのクォートのすべてのティックを1つのチャートにまとめることですか?

 

どうしてこれが攻撃的だと思うのですか?それは、礼儀の原則を思い出すに過ぎない。何かを提供する前に、何かを見返りに置かなければならない。何もなければ聞くしかない、これが真理です。

私は64ビットシステムにはあまり経験がありませんが、このトピックには非常に興味があります。何も恥じることはないと思います。

 
FAQ:

なぜこれが攻撃的だと思うのですか?それは、礼儀の原則を思い出すに過ぎない。何かを提供する前に、何かを見返りに置かなければならない。何もなければ聞くしかない、これが真理です。

私は64ビットシステムにはあまり経験がありませんが、このトピックには非常に興味があります。何も問題はないだろう。


感情に流されてしまったようですが、司会者ですから口には気をつけます、ご指摘ありがとうございます、熱情を冷ますよう努めます。

さようなら。アレクサンダー

 
expertboss:

ここで、これらのすべてのティックを加算して、エキスパートアドバイザーまたはエキスパートアドバイザーが動作するウィンドウに適用することができるかどうか""""考えています。と、1足だけの見積もりよりも多くの刻みをつけて終了します。

アレクサンダー

リソースをループさせたくない・・・。つまり、全気配値のティックを1つのチャートにまとめたいのですね。

EAは自分自身のティックにしか反応しないので、何かを「追加」することはできません。タイマーを設定するか(私が提案したとおり)、別のチャートでループしたEAを並行して実行し、EAを「ティック」させるかです。そして、このループ型EAでは、「刻む」条件を指定することができます。例えば、お客様のケースのようにTimeCurrent() の値が変化した場合。とはいえ、やはり、最初のEA(=自分の時計)が同じようにできるのであれば、EAを追加する意味はないと思うのですが。

 
実は、すべての問題の解決策は、メモリ内のStart関数のアドレスを見つけることなのです :)そうすると、マルチスレッドプログラムの実行 まで、いろいろなことが考えられるようになります。
 
私は、端末が定期的に刻みを受信しないとタイマーがそれぞれEAは、コードを介して動作しているいくつかの点でEAは、注文を閉じるために、例えば偽のリクエストを送信し始め、そこにそれが最終的に判明したときに次の計画の問題に直面したサーバーは、一般的なエラー "2" その後エラー "3" と注文番号、等によって同じを与えるかもしれません送信します私はこの方法で脱出しました """""""""""""""""""""""""""""""""""if (OrdersTotal()==0){Alert ("Nothing to delete");Sleep(1000);break;}"""""""""""""""".// 注文がなければ、ループを閉じて終了する """"""""""""""(exit while)ですが、ちょっと不正解ですよね。 質問:サーバーからtrueの 返事が来るまでティックを中断して(例えばtrue=OrderClose (OrderTicket(),...), その後は通常通り)、何らかのコマンドやオペレータ(何と呼んでいいのかもわからない)を作ることは可能でしょうか?もちろん、これは可能な範囲での要望です。 もう一つ観察すると(週末に気づいたのですが)、チャートをずらすと、ジェネレーターの位置か通常のティックに戻り、「EAs」というボタンが解放されてティックはないのですが、とにかくチャートは戻り、チャートからEAを削除すると、すべてこれが止まりました。 Sv.アレクサンダー
 
Meat:

とにかく、これが機能の最終バージョンです。

// push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;

私の理解では、PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1) コマンドを使用していますね。このコマンドはExpert Advisorのティックをエミュレートします(WinUser32.hの記述による)。インジケーターの場合、ティックはエミュレートされないので、結果的にインジケーターは更新されません。残念ながらテスト用のWinXPは持っていませんが、XPでインジケーターの刻みがエミュレートされるのであれば、驚きますね。

アルゴリズムも確認しました

  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);

をデバッガVisualStudioで実行したところ、TimerCodeの配列に表示される結果が期待した結果と全く一致しませんでした。このアルゴリズムにエラーがないことは確かですか?コードと結果のスクリーンショットをお渡しします。ご希望であれば、さらに詳しいお話を伺えるかもしれません。

 

この話題は今となってはあまり現実的ではありませんが、新ビルドへの移行を急がない方もまだいらっしゃると思いますので :) そのため、Win7/Win8でティックタイマーがない人は、DEPツールを無効化するか、この機能を追加する必要があります。

#import "kernel32.dll"
  bool  VirtualProtect(int lpAddress[], int dwSize, int flNewProtect, int& lpflOldProtect[]);

そして最後にこのバリアント。

int SetMyTimer(int interval=1000, int timerId=0)
{    
  int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message");
  int hWnd= WindowHandle(Symbol(),Period());
  int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA");
  if (PostMsgAddr==0 || hWnd==0) return(0);
  static int TimerCode[7];  ArrayInitialize(TimerCode,0);
  int oldprotect[1]; 
  VirtualProtect(TimerCode, ArraySize(TimerCode)*4, 0x40, oldprotect);  // PAGE_EXECUTE_READWRITE
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
  int bytes[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC2,0x10 };
  int len[]=  { 1,    1,   1,    1,   1,  1,   1,  1,   4,    1,   4,    1,   4,    1,   1,    1,    1,   2 };
  bytes[8]=MT4InternMsg;  bytes[10]=hWnd;  bytes[12]=PostMsgAddr;
  int nbyte=0;  
  for (int i=0;  i<ArraySize(bytes);  i++)
    for (int j=0;  j<len[i];  j++, nbyte++)
      TimerCode[nbyte/4] |= bytes[i]>>(8*j)&0xFF<<(nbyte%4*8);
  timerId= SetTimer(hWnd, timerId, interval, TimerCode);
  return (timerId);
}