初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 17

 
Babu Bonappan:

OrderOpenPriceは、私が理解しているように、私が必要とするものを正確に与えてくれます。ただし、入金通貨が USDで、取引ペアがEUR/USDの場合のみ。この場合、OrderOpenPriceには、注文を開始した時点の基準通貨と入金通貨の為替レートが格納されており、それを知ることで簡単に入金額を計算することができるのと同じことです。

しかし、これらの条件の少なくとも1つが満たされない場合、個々の注文の保証金の値をどのように取得すればよいのでしょうか。建値の基準通貨と預金の通貨との相対的なレートは、どこで確認できますか?

はい、注文開始時刻を秒単位で把握しています。しかし、何が得られるのか?最大で - 必要なシンボルの分ローソクのパラメータ。しかし、決して預金計算に使用したレートの正確な値ではありません。しかし、AccountMargin関数は、なぜかそれを取得するのです。具体的にどうやるのか、ぜひとも理解したい。

マージンを計算するためには、3つの計算式が必要です。

入金通貨に応じて、任意の通貨ペアの証拠金を計算します。

計算に誤差が生じる可能性があります。しかし、計算結果を預金の基準通貨の100分の1に丸めたときに表示されるものよりもはるかに小さくなります、つまり、ドルであれば、セントを意味します。

追記

AccountMarginは現在の、つまり最後の値です。

 

MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot を使用して、注文開始時の証拠金の 正確な値を取得する場合はどうなりますか? - それは常に小数点以下2桁になりますよね?そして、それを100倍して、この注文のMagicNumberとして保存します。そして必要であれば、そこから取り出して100.0で割ってみる。

これでいいのでしょうか?

 
Babu Bonappan:

MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot を使用して、注文開始時の証拠金の 正確な値を取得する場合はどうなりますか? - それは常に小数点以下2桁になりますよね?そして、それを100倍して、この注文のMagicNumberとして保存します。そして必要であれば、そこから取り出して100.0で割ってみる。

これでいいのでしょうか?

繰り返しになりますが、MagicNumberはそのためにあるのではありません。ログファイルに書き込んでから読み込むとよいでしょう。

すべては、そのような計算の目的と、プログラムが設計されている注文数に依存します。

このような緻密な計算が必要なのは、ブローカーや証券会社だけのような気がします。

この観点からすると、最適解はロギングでしょう。

 
Vitaly Muzichenko:

なんで看板の数で嘘をつくんだ?人を惑わさないこと。

高精度計数をご存知ないのですか?

 

延期となりました。

簡単なExpert Advisorを書き かけましたが、1つだけ難点があります。

ハーフロットのクロージングが正しく動作せず、注文が毎ティックごとに変更される。

購入する改造のブロックはこちら

if (CountBuy()>0) //買い注文の件数をカウントする関数です。
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //価格が指標から必要な動きを経過している場合。
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //ここでStopをBreakevenに変更する。
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //半分のロットを決済しようとする。
Print("Error of closing half of lot to buy");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //ここで、残りの部分をBreakevenに移動させます。
Print("Error of modification to breakeven on purchase");

}} }


 
Vladimir Karputov:

再掲載しました。

貼り付けて、読みやすくしてください

 
この問題に対する対処法を教えてください。外部インジケータを使った簡単なExpert Advisorを ほぼ書き上げた のですが、一つ問題が発生しました。

ブロックに OrederClose がある場合、ロットの半分が直ちに閉じられ、OrderModify はもはや機能しません。

OrederCloseを削除すると、OrderModifyは各ティックでオーダーを変更する

購入する改造のブロックはこちら

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
価格がMinMoveに達した場合、注文の半分をクローズし、残りの半分を一旦Breakevenにするには、どのようにすればよいでしょうか。
 
Vasiliy Danilov:
対処法を教えてください。外部インジケータを使った簡単なExpert Advisorを ほぼ書き上げた のですが、一つ難点があります。

ブロック内にOrederCloseがあると、すぐにロットの半分が閉じられ、OrderModifyが機能しなくなる。

OrederCloseを削除すると、OrderModifyは毎ティックごとに注文を変更します。

購入する改造のブロックはこちら

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
価格がMinMoveに達した場合、半分をクローズし、もう半分をBreakevenにするには、どのようにすればよいでしょうか。

ロットの半分を閉じるエラーが発生し、修正されません。上記の私の投稿にしたがって修正してください。

そして、それを一度行うには、ブレイクイーブンを一定のポイント数に設定し、この数字を遵守しているという事実に、注文のテイクプロフィットのチェックの条件を加える必要があります

そして、注文修正ブロックにおいて価格がそのような条件を通過したとき、注文の半分がクローズされるはずです

 
Alexey Kozitsyn:
いや、自分がやっていることを理解しようとする。あなたが書いたものは、関数のプロトタイプに 過ぎません(つまり、その関数が何をするのかを記述しただけのものです)。だから、ドキュメントから切り取っただけなんですね。使う必要があります。だから、自分の価値観を引数に代える必要があるのです。そして、この関数はその結果を返します。そして、この結果を処理する必要があります。

返信ありがとうございました.インターネットを半分ほど検索してみましたが、StringFind 関数を使った例はほとんどなく、見つけたものから、パラメータはこうあるべきという結論に達しました。

intStringFind()

stringcomment =OrderComment()// 探索対象の文字列
stringOrderStopLoss, OrderTakeProfit// 求めるもの
intstart_pos=0// 検索を開始 する位置

);

...間違っていたら訂正してください.

 
Vitaly Muzichenko:

なんで看板の数で嘘をつくんだ?人を惑わさないこと。

ブローカーごとに異なるポイント