MQL4に関する質問 - ページ 7

 
init/deinitがどのように機能するかについては、フォーラムのどこかに開発者が詳しく書いています。どなたかリンクを貼っていただけませんか?
 
DelphiでDLLを作成し、MT4から呼び出しています。参照渡しされる単純なパラメータ以外はすべて動作します。Delphiでは以下のように宣言されています。

procedure Test2(var i: integer); stdcall;
begin
if addr(i) = nil then ShowMessage('What the hell?');
end;

stopとして呼び出す。

#import "DLL1.dll"
void Test2(int& i);

私は
int init() {
int x = 5;
Test2(x);
return(x);
}

呼び出されると、変数 integer への参照がスタックにあるはずだが null がある
では int のパラメータを参照で渡すにはどうするか?
配列を渡す場合、配列の値は参照渡し

使用
MetaEditor 4.00 build 183
MetaTrader 4.00 build 186

もう一つの質問:文字列を参照渡しした場合、文字列バッファのサイズは?

もう一つの質問:
関数の結果として文字列を渡した場合、その文字列に割り当てられるメモリ領域はどこでしょうか?DLL内のグローバル変数 へのポインタを渡すべきですか?この場合、メタトレーダーのどのモードでも、異なるスレッドから同時にDLLが呼び出されることはないのでしょうか?

ありがとうございました。
 
現在の実装では,1つのソースコード内でパラメータを参照渡しすることしかできませんが,配列は例外です
 
MQL4でこれを実装する方法
一日の初めに2つの保留注文を 設定
1つ(いずれか)がトリガーされると - 2つ目は削除される
バー(例えば日足)のクローズの5分前にトリガーされたものを閉じる(SLまたはTPによって閉じられなかった場合)
もし保留注文が発動されない場合はバーを閉じる5分前にそれらを両方とも削除
どうもありがとうございました。
 
1) 文字列を参照として渡した場合、その文字列の受信バッファの大きさはどのくらいですか?

2) 関数の結果として文字列を渡す場合、文字列用のメモリ領域はどこに割り当てればよいのでしょうか?DLL内のグローバル変数 へのポインタを渡すべきですか?この場合、メタトレーダーのどのモードでも、異なるスレッドから同時にDLLが呼び出されることはないのでしょうか?

ありがとうございました。
 
MQL4でこれを実装する方法 <br/ translate="no"> 一日の始まりに2つの保留中の注文を設定
1つ(いずれか)がトリガーされたとき - 2番目は削除されます
バー(毎日を言う)の終了前に5分トリガー(それは、またはTPによって閉じられなかった場合)閉じる
トリガー保留注文がなかった場合、バーを閉じる前に5分それらを両方削除
前もってありがとうございます。

適切なタイミングでペンディングオーダーを設定する(簡単ですね)。そして、オーダーを確認し始めるのです。買いや売りの注文が出たらすぐに、保留中の注文を削除 する作業を行います(さらに簡単)。そして、タイミングを見計らって、すべての注文を決済する作業をする(これは簡単だ)。
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

こうして実装すると、適切なタイミングでペンディングオーダーを入れるのです(簡単ですね)。そして、オーダーを確認し始めるのです。買いまたは売りの注文が表示されたら、すぐに保留中の注文を削除して作業します(これはさらに簡単です)。そして、適切なタイミングで、すべての注文を決済する作業を行います(とても簡単です)。


動作するコードをお願いしました(もしかしたら誰かが実装しているかもしれません)。
私がしたすべてが動作しませんでした...odrerdeleteのプロセスは、何らかの形で混乱を招いています。
もう一つの質問:価格が何分間かフリーズ(ティックがない)することがあります。つまり、他のシンボルではティックを受信しているのに、int start() 本体が実行されないので、注文を閉じることができません。ティックのあるシンボルから Curetime 値を渡すことは可能でしょうか?
簡単に言うと、Curetimeの値は実質的にフリーズしません。
 
やりたいことは、ABC。基本的な演算子の仕組みを理解しなければ、深みにはまることはできません。また、どのチャートからでもすべての注文を決済することができます。このようにしてもよいでしょう。
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3|cmd==4|cmd==5)result=OrderDelete(OrderTicket()).OrderDelete(OrderTicket); if(z=1|cmd==5); if(z=1|cmd==6|cmd==7|cmd==8); if(z=1|cmd==7); if(z=1|cmd==8) 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); } (注)1.
 
やりたいことは、ABC。基本的な演算子の仕組みを理解しなければ、深みにはまることはできません。また、どのチャートからでもすべての注文を決済することができます。こんなやり方もあるんですね。<br/ translate="no">
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3||cmd==4|cmd==5)result=OrderDelete(OrderTicket()).OrderDelete(OrderTicket()).If(cmd==2|cmd==4|cmd==5|); if(cmd==3|cmd==4|cmd==6) 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); } (注)1.



そして、このコード片は何をするものなのでしょうか?まだ発動していない
保留中の注文を 両方削除します。
 
バーが閉まる5分前にすべての注文を破棄するように頼んだので、すべて破棄してくれるでしょう。時間を正しく設定するだけです。そして、不要な注文をクローズするために他のコードを使用します。それとも、プログラムを全部書いてもらうか?