これが疑問の残る部分だ:
bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type) { //--- 始値を取得 MqlTick mqltick; SymbolInfoTick(symb,mqltick); double price=mqltick.ask; if(type==ORDER_TYPE_SELL) price=mqltick.bid; //--- 自己資本と必要証拠金 double margin,equity=AccountInfoDouble(ACCOUNT_EQUITY); //--- テスト関数を呼び出す if(!OrderCalcMargin(type,symb,lots,price,margin)) { //--- 何か問題が発生した。 Print("Error in ",__FUNCTION__," code=",GetLastError()); return(false); } //--- 運用資金が不足している場合 if(margin>equity) { //--- エラーを報告し、falseを返す Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError()); return(false); } //--- テストは成功した return(true); }
なぜ必要証拠金はエクイティと比較され、フリーマージンとは比較されないのか?
これが疑問の残る部分である:
なぜ、必要証拠金はエクイティと比較され、フリーマージンとは比較されないのですか?
記事をありがとうございました。
bool CheckMoneyForTrade(string symb, double lots,int type) { double free_margin=AccountFreeMarginCheck(symb,lots,type); //-- 十分な資金がない場合 if(free_margin<0) { string oper=(type==OP_BUY)? "Buy":"Sell"; Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError()); return(false); } //-- テストは成功した return(true); }
AccountFreeMarginCheckの どの バリエーションもエラーを出し、マーケット用のExpert Advisorを設定することが全くできません。
GetLastError()!=134の条件にGetLastError()!=134を追加したり、上記の関数を使ってもエラーで失敗するだけ。
上記の関数は、このようにエラーを投げることに成功している。
2016.07.25 15:15:54.200 2016.01.04 19:59 RSI_Grabber.1.1 XAUUSD,H1: invalid lots amount for FreeMarginCheck function 2016.07.25 15:15:54.200 2016.01.04 19:59 RSI_Grabber.1.1 XAUUSD,H1: Not enough money for Buy 0.1 XAUUSD Error code=4051
間違っているかもしれませんが、0.1は手で指定する通常のロットです。 通貨ペアのMODE_MINLOTは0.01です。
しかし正直なところ、掘り下げれば掘り下げるほど、何が問題なのかわからなくなってくる。
おそらく、この関数でロットを正規化し、無効がないようにすべきだろう。
そして、この関数は資金がないことを書き込みますが、ポジションをオープン するリクエストをサーバーに送信しません。
私は最近、このような命令を2年ほど前に使い始めました:
double margin=EMPTY_VALUE; margin=AccountFreeMarginCheck(sy,op,ll); if(margin>0) { ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)), coomment,mn,0,clOpen); } else Print("Not Enought Money Margin Required"+(string)margin);
実際にすべてが動作します。
取引を開始すると、Expert Advisor は単にPrint("Not Enought Money Margin Required "+( string)margin) string を返します;
このExpert Advisorは市場でテストされ、誰もが満足しています。
正確な計算にはこのオプションを使う。そうすれば、自由に比較することができます。
Laverage = AccountInfoInteger(ACCOUNT_LEVERAGE); //肩 RazmerKontrakta=LotSize*MarketInfo(Symbol(),MODE_LOTSIZE); /TradeVol*1ロット MargaB=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits()); MargaS=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits()); FreeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
著者の皆様、記事をありがとうございます。
MQL4のコードに小さな間違いがあります。CheckMoneyForTrade 関数について:
double free_margin=AccountFreeMarginCheck(symb,lots,type);
は必須です:
double free_margin=AccountFreeMarginCheck(symb,type,lots);
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 マーケットでの公開前にトレードロボットに行うべき検査 はパブリッシュされました:
マーケットの全ての製品は、均一な品質基準を確保する為に、公開前に事前の必須検査を受けます。この記事では、開発者が自分のテクニカルインディケータやトレードロボットで犯しがちなミスについてお話しします。また、マーケットへ提出する前の、製品の自己テストの方法もご紹介します。
プラットフォームに組み込まれたストラテジーテスターは、取引システムを履歴上でチェックするだけでなく、トレードロボット作成時に見過ごした論理/アルゴリズムエラーを検出することができます。テスト時の取引操作やエラー検出に関するメッセージは、全てテスターの操作ログに表示されます。これらのメッセージは、コンテキストメニューのコマンドで呼び出される、特別なログビューアで分析するのに便利です。
作者: MetaQuotes Software Corp.