0

私はこのロジックをコーディングしようとしています:

if no open orders and buy logic ( DayOpen - 10 * Point )
then buy

if bought
Sell when the one(しかも唯一)bought order reaches Take Profit price.


これが私がこれまでに持っているものです:

double DayOpen = iOpen( NULL, PERIOD_D1, 0 );
double TP      = 10.0;
int    ticket;

if ( OrdersTotal() == 0 && Bid == DayOpen - 10 * Point );
{    OrderSend( Symbol(),
                OP_BUY,
                1.0,
                Ask,
                0,
                0,
                Ask + TP * 10 * Point,
                NULL,
                12321,
                0,
                Blue
                );
}
4

2 に答える 2

1

プロローグ
( StackOverflow の完全な M.C.V.E.投稿に重点を置いても問題ありません)

コードは、少なくとも構文的には正しいはずです。

{                                                     // outer context missing
// .                                                  // outer context missing
// ..                                                 // outer context missing
// ...                                                // outer context missing
   RefreshRates();     // a life-saving jacket while  // outer context missing

   if (  OrdersTotal() == 0
      && Bid           <= iOpen( _Symbol, PERIOD_D1, 0 )
                        - ( 10 * _Point )
      )
   {  OrderSend( _Symbol,                            // <symbol>
                 OP_BUY,                             // <op> 
                 1.0,                                // <volume>
                 Ask,                                // <XTO_price>
                 0,                                  // <slippage_allowed>
                 0,                                  // <autoXTO_SL>
                 NormalizeDouble( Ask + 10 * _Point, // **ALWAYS**
                                  _Digits            // NORMALIZE XTO levels
                                  ),                 // <autoXTO_TP>
                 NULL,                               // <commentSTRING>
                 12321,                              // <MagNUM>
                 0,                                  // <expireSECONDs>
                 clrBlue                             // <arrowCOLOR>
                 );
   }

// ...
// ..
// .

}

エピローグ

特定のロジックに追加の構造を追加する必要はありません。MetaTrader Terminal 4詳細がOrderSend()リモートMetaTrader 4 Serverに送信され、値がブローカー側の利用規約を満たしている場合、そのような取引ポジションが開かれます (市場リスクにさらされますが、完全にバックアップされ、株式によってカバーされます)。

同時に、 FX マーケットが事前定義された終了レベルに達した瞬間に、そのMetaTrader 4 Serverようなポジションが終了するために他のコード自体が必要とされないようにします。<autoXTO_TP>TP

上記は真実ですが、プロフェッショナル グレードのアルゴ取引システムには、コア取引ロジックに付随する他の多くのユーティリティ サービスがあると言っても過言ではありません。参考までに、約 80.000 ~ 100.000SLOC秒の設計は、製品グレードのシステムで一般的です。


ここからどこへ行く?

ドキュメントを読み直すと役立つかもしれません(これを少し明確にしましょう-ローカルホストにインストールされ、更新された実際のリリースのリリース-新しい-言語...上の静的で「古い」テキストではありませんWeb では、構文規則とコンテキスト固有の制限がかなり忍び寄っているため、「古い」構文コード スニペットを使用して別の問題に再び頭を悩ませるのではなく、依然としてそうです (下記参照)。MQL4 MQL4


MQL4

このMQL4言語はここ数年で大きく進化し、Web に投稿されたコード スニペットの多くは、「言語の内部」で起こったパラダイムの多くの変化や、コード実行プラットフォームの変更により、説明の価値を失いました。

苦い?はい。
痛い?はい。

これが人生だ とはいえ…

于 2016-03-28T19:14:52.730 に答える
0

したがって、ロジックの最初の部分 (取引を開く) は正しいと思います。ここで、注文の 1 つが TP に達したときにすべての注文をクローズするようにします。これを行う方法は次のとおりです。

start()これを関数に追加します。

int total = OrdersHistoryTotal();
for (int i = total - 1; i >= 0; i--)
{
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
    {
        Print("Error selecting order from history: ", GetLastError());
        break;
    }
    if ((OrderSymbol() != Symbol()) || (OrderType() != OP_BUY) || (OrderClosePrice() < OrderTakeProfit())) continue;
    CloseAll();
    break;
}

そして、これはstart()関数の外にあります:

void CloseAll()
{
   int total = OrdersTotal();
   for (int i = total - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS) == false) continue;
      if ((OrderSymbol() != Symbol()) || (OrderType() != OP_BUY)) continue;
      RefreshRates();
      OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
   }
}
于 2016-03-28T19:04:01.013 に答える