Benjamin Fotteler #: 情報ありがとうございます。取引ロボットが通過しなければならないチェックの 中で、「CheckMoneyForTrade」というメソッドが言及されており、これは取引に使用される証拠金が無料証拠金(ACCOUNT_FREE_MARGIN)より大きいかどうかをチェックします。私の理解が正しければ、使用される資金が口座残高の一定割合を超えるかどうかもチェックする必要があります:
もちろん、0.9を(1 - maxRisk)に変更し、ユーザーが設定できる "Maximum Risk in %"プロパティを実装することができます。
I wanted to close all orders before end of the week (market close friday,) to prevent loss should the market gap over the week end, by passing the sl. ) so the question is when does the market close (or open. For example info on opened charts and history data, time info (like gmt, timezone, dst), market open, close info
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
"calculate lotsize "を検索: https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
もちろん、0.9を(1 - maxRisk)に変更し、ユーザーが設定できる "Maximum Risk in %"プロパティを実装することができます。
追伸:フォーラムでは姓と名のどちらを使用しますか?情報ありがとうございます。取引ロボットが通過しなければならないチェックの 中で、「CheckMoneyForTrade」というメソッドが言及されており、これは取引に使用される証拠金が無料証拠金(ACCOUNT_FREE_MARGIN)より大きいかどうかをチェックします。私の理解が正しければ、使用される資金が口座残高の一定割合を超えるかどうかもチェックする必要があります:
もちろん、0.9を(1 - maxRisk)に変更し、ユーザーが設定できる "Maximum Risk in %"プロパティを実装することができます。
追伸:このフォーラムでは、私たちはファーストネームで呼び合っているのでしょうか?誰もがロットサイズでつまずき、ここにはたくさんのコードとコメントがあります!
私は今、ウィリアム・ローダーがMT5用に書いたものを一緒に考えました。それは、テストされていない(!!)関数でしょう:
(https://www.mql5.com/en/forum/133792/page3#comment_3405179&https://www.mql5.com/en/forum/390088#comment_28092477)
間違いを見つけたら教えてください!
ここでは、ほとんどの人がニックネームやファーストネームで匿名であり、以前はもっとそうであったので、"Du "は自然なものになりました。
コードをありがとう。唯一欠けていたのは、有効な中間ロットサイズへの適応でした:
もう1つ質問があります。TICK_VALUEまたは上記のようにdeltaValueでストップアウトした取引の損失を計算すると、結果は常にMQL5の内部計算と若干異なります:
これは、1ティックあたりの損失/利益がユーロ口座、市場価格1.0と市場価格1.2で異なるためですか?下のコードで、例えばpriceの代わりに "price + 0.1"、slの代わりに "sl + 0.1 "と入力すると、ティック距離(diff)は同じですが、OrderCalcProfitが 出力するそれぞれの結果は異なります。そして、手動取引で得た損益を見ると、後者が確認できるようです。
もし私の考えが正しければ、以下のコードの方がより正確でしょう:
追伸:基本的なアイデアをありがとうございました。リスク・ファクターを残高ではなくフリー・マージンに結びつけることは、明らかに理にかなっています。以下のコードは、mql5独自のエキスパート・パラボリック・サーに従って作成したものです。ここで、買いシグナルと売りシグナルの動作を逆にすることはできますか? つまり、買いシグナルが来たら、買いの代わりに売りを建てたいのですが、どなたか教えてください。
#プロパティのコピーライト "Copyright 2022, MetaQuotes Ltd."
#プロパティリンク"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| インクルード
//+------------------------------------------------------------------+
#インクルード <ExpertExpert.mqh
//--- 利用可能なシグナル
<include <ExpertSignalSAR.mqh> //--- 利用可能なシグナル
//--- 利用可能な末尾
#include <ExpertTrailing↩TrailingNone.mqh> //--- 利用可能な資金管理
//--- 利用可能な資金管理
#include <ExpertMoneyMoneyFixedLot.mqh> //--- 資金管理可能
//+------------------------------------------------------------------+
//| 入力
//+------------------------------------------------------------------+
//--- 専門家の入力
input string Expert_Title ="sar"; // 文書名
ulong Expert_MagicNumber =13831; // エキスパート番号
bool Expert_EveryTick =false; // エブリ・ティック(Expert_EveryTick)
//--- メイン信号の入力
input int Signal_ThresholdOpen =10; // オープンにする信号のしきい値 [0...100]
input int Signal_ThresholdClose=10; // クローズするシグナルのしきい値 [0...100]
input double Signal_PriceLevel =0.0; // 取引を実行する価格レベル
input int Signal_Expiration =4; // 保留注文の有効期限(バー単位)
input double Signal_SAR_Step =0.02; // パラボリックSAR(0.02,0.2)の速度増分
input double Signal_SAR_Maximum =0.2; // パラボリック SAR(0.02,0.2) 最大レート
input double Signal_SAR_Weight =1.0; // 放物線状SAR(0.02,0.2) 重量 [0...1.0] //-- 貨幣入力
//--- お金の入力
input double Money_FixLot_Percent =10.0; // パーセント。
input double Money_FixLot_Lots =0.1; // 固定数量
//+------------------------------------------------------------------+
//| グローバル・エキスパート・オブジェクト
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| エキスパートの初期化関数
//+------------------------------------------------------------------+
int OnInit()
{
//--- エキスパートの初期化
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
{
//----- 失敗
printf(__FUNCTION__+": エラーのエキスパートの初期化");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- シグナルの作成
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//----- 失敗
printf(__FUNCTION__+": シグナル作成エラー");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.Expiration(Signal_Expiration);
//--- フィルタの作成 CSignalSAR
CSignalSAR *filter0=new CSignalSAR;
if(filter0==NULL)
{
//----- 失敗
printf(__FUNCTION__+": filter0作成エラー");
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter0);
//--- フィルタのパラメータを設定する
filter0.Step(Signal_SAR_Step);
filter0.Maximum(Signal_SAR_Maximum);
filter0.Weight(Signal_SAR_Weight);
//--- トレーリングオブジェクトの作成
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//----- 失敗
printf(__FUNCTION__+": error creating trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- エキスパートに末尾を追加する(自動的に削除されます))
if(!ExtExpert.InitTrailing(trailing))
{
//----- 失敗
printf(__FUNCTION__+": trailingの初期化エラー");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- トレーリング・パラメータの設定
//--- マネーオブジェクトの作成
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
{
//----- 失敗
printf(__FUNCTION__+": マネー作成エラー");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- エキスパートにお金を追加する (自動的に削除されます))
if(!ExtExpert.InitMoney(money))
{
//----- 失敗
printf(__FUNCTION__+": お金の初期化エラー");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- マネーパラメータを設定する
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- すべての取引オブジェクトのパラメータをチェックする
if(!ExtExpert.ValidationSettings())
{
//----- 失敗
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- 必要なすべてのインジケータのチューニング
if(!ExtExpert.InitIndicators())
{
//----- 失敗
printf(__FUNCTION__+": インジケータの初期化エラー");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- OK
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| エキスパートの初期化関数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| イベントハンドラ関数
//+------------------------------------------------------------------+
void OnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+
//| トレード」イベントハンドラ関数
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| タイマー」イベントハンドラ関数
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
私は今、あなたのソリューションを理解する時間がありました。MQのデモ口座の金と銀で見ることができるように、より正確で(もう一方は手数料が考慮されるため、より慎重なのでしょうか?
MQ口座では、ロットサイズが高すぎます。
以下は2つの方法を比較するためのスクリプトです:
私はin > sl(買い)またはin < sl(売り)から方向を導きました。そうすれば、保留中の注文に問題はないでしょう。
テストありがとうございます。はい、結果を互いに比較すると、OrderCalcProfit の一貫性と、少なくとも EURUSD と RoboForex については、結果がおよそ「Lot size * CommissionPerLot」だけ異なることがわかります。これは追加することができます:
フォーラム検索を正しく使用した場合、MQL5を使用して直接 "CommissionPerLot "値を照会する方法はありませんよね?
フォーラム検索を正しく使用した場合、MQL5を使用して "CommissionPerLot "の値を直接照会する方法はないのですね?はい、ターミナルで直接ではなく、ブローカーまたは取引履歴のDEAL_COMMISSIONで 要求します。