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");
}} }
If SL !=OrderStopLoss()) modify ...SLが現在のOrderStopLossと 異なる場合のみ、注文が修正 されます。
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("Ошибка модификации в безубыток на покупку");
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("Ошибка модификации в безубыток на покупку");
{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot を使用して、注文開始時の証拠金の 正確な値を取得する場合はどうなりますか? - それは常に小数点以下2桁になりますよね?そして、それを100倍して、この注文のMagicNumberとして保存します。そして必要であれば、そこから取り出して100.0で割ってみる。
これでいいのでしょうか?
OrderOpenPriceは、私が理解しているように、私が必要とするものを正確に与えてくれます。ただし、入金通貨が USDで、取引ペアがEUR/USDの場合のみ。この場合、OrderOpenPriceには、注文を開始した時点の基準通貨と入金通貨の為替レートが格納されており、それを知ることで簡単に入金額を計算することができるのと同じことです。
しかし、これらの条件の少なくとも1つが満たされない場合、個々の注文の保証金の値をどのように取得すればよいのでしょうか。建値の基準通貨と預金の通貨との相対的なレートは、どこで確認できますか?
はい、注文開始時刻を秒単位で把握しています。しかし、何が得られるのか?最大で - 必要なシンボルの分ローソクのパラメータ。しかし、決して預金計算に使用したレートの正確な値ではありません。しかし、AccountMargin関数は、なぜかそれを取得するのです。具体的にどのように行っているのか、非常に興味深いところです。
OrderOpenPrice - 注文の開始価格、それ(価格)は、ある通貨と別の通貨の比率です。
AccountMargin - すべての未決済注文に対する口座の合計マージンを提供します。
延期となりました。
ヴァシリー・ダニロフ 2016.12.02 07:18
どうしたらいいのか、教えてください。外部インジケータを使った簡単なExpert Advisorを書き かけましたが、1つだけ難点があります。
ロットの半分をクローズすると正しく動作せず、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");
}} }
If SL !=OrderStopLoss()) modify ...SLが現在のOrderStopLossと 異なる場合のみ、注文が修正 されます。
また、クローズ時の不具合を把握するために、GetLastError()を使用します。一般的には、OrderCloseを確認すると良いでしょう ...bool testOrCls
testOrCls=OrderClose・・・・・・。
if(!testOrCls) Print (GetLastError() );
すなわち、エラーがあればエラーコードを求め、エラーがなければエラーコードを求めない。
返信ありがとうございました.インターネットを半分ほど検索してみましたが、StringFind 関数を使った例はほとんどなく、見つけたものから、パラメータは必ず
intStringFind()
stringcomment =OrderComment()// 探索中の文字列stringOrderStopLoss, OrderTakeProfit// 求めるもの
intstart_pos=0// どの位置から検索を開始 するか?
);
...間違っていたら、訂正してください.
ちょっとそういうわけにはいきません。この関数の引数は、1)検索したい文字列、2)検索したい文字の組み合わせ、3)検索の開始点(デフォルトでは、手順1による文字列のNULL文字から)です。
文字列の何番目の位置から部分文字列が始まるかを返し、部分文字列が見つからなければ -1 を返す。
つまり、このように書くのです。
ロットの半分を閉じるエラーが出ているので、修正不可能です。上記の私の投稿にしたがって修正してください。
一度だけ行う場合は、breakevenを固定数で指定し、その数に一致するかどうかを注文テイクプロフィットチェックの条件として追加する必要があります
そして、そのような状態をオーダー変更ブロック内で通過すると、ハーフが閉じられる。
どうしたらいいのか、教えてください。外部インジケータを使った簡単なExpert Advisorを ほぼ書き上げた のですが、一つ問題があります。
ブロック内にOrederCloseがあれば、ロットの半分が直ちにクローズされ、OrderModifyはそれ以上機能しない。
OrederCloseを削除すると、OrderModifyは各ティックでオーダーを修正する。
購入する改造のブロックはこちら
{ 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("Ошибка модификации в безубыток на покупку");
} } }
ところで、今気づいたのですが、OrderSelect by position SELECT_BY_POSとありますが、ticket selectionはどこでしょうか?
オーダークローズ(OrderTicket())
MQL4を使って、ターミナルで各オープンポジションのマージン値を取得する方法を教えてください。
以前はこんな風にやっていました。
EUR/USDの取引では、この構築はうまく機能し、そのロジックが正しいことを確信しました。
しかし、今度はEUR/JPY(またはEUR/CHF)で同じ結果を得たいのです。明らかに、OrderOpenPrice()の 代わりに、私は基準通貨と入金 通貨のレート(私の場合、EUR/USD)によって標準ロットの値を乗算する必要があります。しかし、このレートは何なのでしょうか?ポジションオープン時の為替レートか、現在(このポジションの保証金額を知りたい時)の為替レートか?
いいえ MODE_MARGINMAINTENANCE?
ところで、SELECT_BY_POSの位置でOrderSelectに気づいたのですが、選択券はどこにあるのでしょうか?
オーダークローズ(OrderTicket())
このスレで全く知らないのか?
オーダーが選択されている場合、OrderTicket()は選択されたオーダーの チケットを返します。また、順番はインデックスやチケットなど、どのように選択されてもかまいません。
チケットによる選択の場合、プールは 考慮されず、どのリストから注文が選択されたかを、その終了時刻を確認しながら確認しなければならないという微妙なところがある。
どうすればいいか教えてください。外部インジケータを使った簡単なExpert Advisorを ほぼ完成させたのですが、一つ問題が発生しました。
ブロック内にOrederCloseがある場合、ロットの半分が直ちにクローズされ、OrderModifyは機能しなくなる。
OrederCloseを削除すると、OrderModifyは各ティックでオーダーを変更する
購入するための改造ブロックはこちら
{ 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("Ошибка модификации в безубыток на покупку");
} } }
チケットの部分的なクローズが変更された場合。まずはブレークイーブン、そしてクローズへ。
どちらかのロジックを変更する。
A1exPit です。
ところで、SELECT_BY_POSによるOrderSelectに今気づいたのですが、選択券はどこにあるのでしょうか?
オーダークローズ(OrderTicket())
このスレで全く知らないのか?
オーダーが選択されている場合、OrderTicket()は選択されたオーダーの チケットを返します。また、順番はインデックスやチケットなど、どのように選択されてもかまいません。
チケットで選択する場合、プールは 考慮されず、どのリストから注文が選択されたかは、クローズした時間を確認する必要があるというニュアンスがあります。
そして、このコメントが書かれたコードを見ると?そこは一筋縄ではいきませんね...。
{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
そして、このコメントが書かれたコードを見ると?そこがはっきりしないんですよね...。
{ 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)) //Пытаюсь закрыть половину лота Какой тикет?