MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 627

 
Sergey Likho:

取引の担保を計算する方法を教えてください。


2つのアプローチを試してみた

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


そして、この1枚

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



最初のものは、私の預金通貨が 米ドルである場合、EURJPYで奇妙な結果をもたらします。配合に何か加える必要があるのでしょうか?

2番目も一度だけ動作し、正しい値を出すこともあれば、無意味な値を出すこともある(預金に依存する)。

正確には、変数valは注文後の自由資金の値を示し、変数FreeMarginCheckは保証金の値そのものを 示します。

 
Igor Makanu:

2番目の選択肢が正しい計算方法というか、注文後にval変数にフリー資金の値を取得し、FreeMarginCheckという 変数に証拠金の値そのものを取得します

本当ですか?

AccountFreeMarginCheck

FALSEY関数は、指定された注文が現在の価格で建てられた後に残る、現在の口座にある自由資金の量を返します。


そこには微妙なニュアンスもあります。

反対売買が行われている場合、つまり口座に完全または不完全なロックがかかっている場合、この関数は不正確な値を返すことがあります。


 
Sergey Likho:

本当ですか?

そうですね、まさにその通りです。

戻り値:現在の口座で指定された価格で注文を開始 した後の、残りの 自由資金 量。

オープントレードについて、あなたがチェックする必要がある、私は覚えていないが、ほとんどの場合、端末の書き込みは、計算されたデータと一致する必要があります:すべてのシンボルの取引(ベイ/セル)の各方向のロットの合計数は、各シンボルのために呼び出します。

AccountFreeMarginCheck()で各方向にロットを渡し、その結果を集計する。

今日も相場は動いています、こんな感じで簡単に確認できます。

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

はじめまして、この機能のどこが問題なのか教えてください。この関数は、時間による取引の一時停止を行うもので、パラメータには一時停止の開始と終了が含まれます。
TimeCurrentが 規定されているにもかかわらず、この関数はブローカーのサーバーからではなく、コンピュータから時刻を読み取ります。一般に、取引は一時停止中に終了し、機能は動作しません。

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

はじめまして、この機能のどこが問題なのか教えてください。この関数は、時間単位で取引を一時停止します。パラメータは、一時停止開始と一時停止終了です。
TimeCurrentが規定されているにもかかわらず、この関数はブローカーのサーバーからではなく、コンピュータから時刻を読み取ります。一般に、一時停止中に取引が終了した場合は、その機能が働いていないことを意味します。

TimeStartとStrToTime(TimeStart)をアンプリントする

その後、unprintTimeCurrent()

あなたのTimeStartは、完全なdatetime形式ではありません。つまり、EAを実行すると、時間は常に現在の日、月、年であり、その後変更されますか?

そして、グローバルに...取引時間と分を決定するには、 時間と分の サーバーの時間と比較する必要があり、あなただけのサーバーの時間は、指定されたものよりも長いという事実を比較することができます

SZZ:混乱を 避けるために、datetimeをint型とみなして、2つのdatetimeを比較すると、2つのint型が 比較されるようにするとよいでしょう。

PSPSです。

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

あなたのコードはおそらく動作するでしょうから、そのように試してみてください。

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


私は普段、この方法で時間を数えています。

int h = TimeHour(TimeCurrent());

int m = TimeMinute(TimeCurrent());

で、EAの設定 と比較します。

 
Igor Makanu:

ありがとうございます、何とかしてみます、私はまだ初心者です)、||の代わりに&&オプションで、オンラインではまだ試していません、ところでこのコードはテスターでは動作します、ターミナルから時間を読み、一時停止中の注文のクローズはありません、しかしオンラインは違います。

 

こんにちは!ストラテジーテスターで ターミナルが起動しません。例えば(2017,04,01~2018,05,29)のように日付を設定し、スタートを押すと、すぐにストップがかかってしまうのです。ログには次のように書かれています。

TestGenerator: 2017.04.01 から 2018.05.29 までの履歴データ 'EURUSD30' がない。 などと、どのセグメントにもある。私のコンピュータは動いている、RAMが足りないかもしれないと思った。自宅のパソコンでも同じで、再起動してもダメですが、しばらくは動きます。Expert Advisorをマーケットからダウンロードし、試用しています。どなたか理由をご存知の方がいらっしゃいましたら、アドバイスをお願いします。


 
danil77783:

こんにちは!ストラテジーテスターで ターミナルが起動しません。例えば(2017,04,01~2018,05,29)のように日付を設定し、スタートを押すと、すぐにストップがかかってしまうのです。ログには次のように書かれています。

TestGenerator: 2017.04.01 から 2018.05.29 までの履歴データ 'EURUSD30' がない。 などと、どのセグメントにもある。私のコンピュータは動いている、RAMが足りないかもしれないと思った。自宅のパソコンでも同じで、再起動してもダメですが、しばらくは動きます。Expert Advisorをマーケットからダウンロードし、試用しています。もし、原因に心当たりがあれば、ヒントを教えてください。


テスターで履歴データがないと言われ、F2キーを押して履歴をダウンロードし、端末を再起動するといいと思います

 
danil77783:

こんにちは!ストラテジーテスターで ターミナルが起動しません。例えば(2017,04,01~2018,05,29)のように日付を設定し、スタートを押すと、すぐにストップがかかってしまうのです。ログには次のように書かれています。

TestGenerator: 2017.04.01 から 2018.05.29 までの履歴データ 'EURUSD30' がない。 などと、どのセグメントにもある。私のコンピュータは動いている、RAMが足りないかもしれないと思った。自宅のパソコンでも同じで、再起動してもダメですが、しばらくは動きます。マーケットからExpert Advisorをダウンロードし、試用しています。もし理由がわかれば、教えてください。


履歴データがない のは、何か意味があるのでしょうか?

 
Igor Makanu:

テスターが履歴データがないと言っているのだと思います。F2キーを押して履歴をダウンロードし、端末を再読み込みしてください

ありがとうございました。試してみようと思います。端末をアップデート すると何か影響があるのでしょうか?アップデートされているかどうかは、自分で教えてくれるけれど......。