記事"マーケットでの公開前にトレードロボットに行うべき検査"についてのディスカッション - ページ 5

 
Oleksii Chepurnyi:
しかし、それでは取引を逃す可能性がある......。
市場のことだ。だからミスはあってはならない。あるいは、彼らの適切な処理があるはずだ。
 
Artyom Trishkin:
市場に関することだ。だからミスはあってはならない。あるいは、適切な処理がなされていなければならない。

市場のためでなかったら、私はあまり気にしなかっただろう)

証拠金はスリッページのためのものだと理解していますが?

 
Oleksii Chepurnyi:

相場がなかったら、あまり気にしなかったと思う)

証拠金はスリッページのためなんですね?

ええ、値動きが激しいときにミスをする確率を少しでも減らすためです。

 
Oleksii Chepurnyi:

相場がなかったら、あまり気にしなかったと思う)

証拠金はスリッページのためだと理解していますが?

スリッページ-約定時、ここでは市場環境状態の瞬間の取引依頼の正しさ

計算 - 正しさをチェックし、必要であれば修正してリクエストを送信。その後、リクエストの結果をチェック。これはEA側です。

そして、約定はサーバー側で、スリッページの値は、価格が変動したときにサーバー部分がリクエストを受け入れるか拒否するかを決めるために、すでに要求されています。

 

午後。

ドキュメントから:

symbol_volume_limit.

このシンボルで許可される最大数量は、オープンポジションと一方向(買いまたは売り)の 保留注文の合計数量です。例えば、上限が5ロットの場合、5ロットの買いポジションを保有し、5ロットの売り指値注文を発注することができます。しかし、買いの指値注文は発注できませんし(一方向の合計数量が指値を超えるため)、5ロット以上の売りの指値注文を発注することもできません。


私が理解する限りでは、取引または注文を発注しようとする方向のすべてのポジションと注文の数量を考慮して計算する必要があります。

しかし、ここでは、1つのシンボルに対するロット数の 制限は、方向は全く考慮されていません。

それとも何か誤解しているのでしょうか?

 
Vladislav Andruschenko:

おそらく、この関数でロットを正規化し、無効がないようにすべきだろう。

そして、この関数は資金がないことを書き込みますが、ポジションをオープン するリクエストをサーバーに送信しません。

私は最近、このような命令を2年ほど前に使い始めました:

実際にすべてが動作します。

取引を開始すると、Expert Advisor は単にPrint("Not Enought Money Margin Required "+( string)margin) string を返します;

Expert Advisorは市場でテストされ、誰もが満足しています。

ありがとう、ウラジスラフ!

以前は問題なく動作していた私のものや、バリデータが私たちを誘導するこのものとは異なり、あなたのバリアントはまだ動作しています:

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);
  }
 
Ramiz Mavludov:
ありがとう、ウラジスラフ!

あなたのバリアントは私のバリアントと違ってまだ動いています:

このコードはどこにありますか?

追記 ポルトガル語版と日本語版の記事で見つけたので修正しました。また
 
Oleksii Chepurnyi:

午後。

ドキュメントから:

symbol_volume_limit.

このシンボルで許可される最大数量は、オープンポジションと一方向(買いまたは売り)の 保留注文の合計数量です。例えば、上限が5ロットの場合、5ロットの買いポジションを保有し、5ロットの売り指値注文を発注することができます。ただし、買いの指値注文を発注したり、5ロットを超える売りの指値注文を発注したりすることはできません。


私が理解する限りでは、取引または注文を発注しようとする方向のすべてのポジションと注文の数量を考慮して計算する必要があります。

しかし、ここでは、1つのシンボルに対するロット数の 制限は、方向は全く考慮されていません。

それとも何か誤解しているのでしょうか?

おっしゃるとおり、この例では方向は考慮されていません。買い注文はポジティブに、売り注文はネガティブに受け取られます。出力される値と符号から、ボリュームと方向がわかります。

次のように修正する必要があります。

 
Rashid Umarov:

このコードはどこに記載されていますか?

追記 ポルトガル語版と日本語版の記事にありましたので修正しました。rdもあります。

今は表示できません。検証のために送信したとき、レポートの148エラーをクリックすると

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);
  }
版はロシア語のままでした。
 
Rashid Umarov:

おっしゃるとおり、この例では方向が考慮されていません。買い注文はポジティブに、売り注文はネガティブに受け取られます。出力される値と符号から、出来高と方向がわかります。

修正が必要

サインについて理解できません。

次のように書きました。

//--- 全アイテムの最大ボリューム
   double max_volume = SymbolInfoDouble(CheckSymb,SYMBOL_VOLUME_LIMIT);
   if(ED(max_volume,0)) return(true);
//---
   double sum_volume = 0;
   int    oper = 0;
   if(CheckOperation==ORDER_TYPE_BUY  || CheckOperation==ORDER_TYPE_BUY_LIMIT  || CheckOperation==ORDER_TYPE_BUY_STOP  || CheckOperation==ORDER_TYPE_BUY_STOP_LIMIT)  oper = 1;
   if(CheckOperation==ORDER_TYPE_SELL || CheckOperation==ORDER_TYPE_SELL_LIMIT || CheckOperation==ORDER_TYPE_SELL_STOP || CheckOperation==ORDER_TYPE_SELL_STOP_LIMIT) oper = 2;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(!pst.SelectByIndex(i)) ShowError;
      if(pst.Symbol()==CheckSymb)
        {
         if(oper==1 && pst.PositionType()==POSITION_TYPE_BUY)  sum_volume += pst.Volume();
         if(oper==2 && pst.PositionType()==POSITION_TYPE_SELL) sum_volume += pst.Volume();
        }
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!ord.SelectByIndex(i)) ShowError;
      if(ord.Symbol()==CheckSymb)
        {
         if(oper==1 && (ord.OrderType()==ORDER_TYPE_BUY  || ord.OrderType()==ORDER_TYPE_BUY_LIMIT  || ord.OrderType()==ORDER_TYPE_BUY_STOP  || ord.OrderType()==ORDER_TYPE_BUY_STOP_LIMIT))  sum_volume += ord.VolumeCurrent();
         if(oper==2 && (ord.OrderType()==ORDER_TYPE_SELL || ord.OrderType()==ORDER_TYPE_SELL_LIMIT || ord.OrderType()==ORDER_TYPE_SELL_STOP || ord.OrderType()==ORDER_TYPE_SELL_STOP_LIMIT)) sum_volume += ord.VolumeCurrent();
        }
     }
   if(sum_volume+CheckVolume > max_volume)
     {
      Alert(OrdersText(0010),DoubleToString(max_volume,VolumeDigits(CheckSymb)));
      return(false);
     }
//---
   return(true);