ライブラリ: MT4Orders - ページ 18

 

数式合成で トレーディング関数を書くことは可能である。

三角裁定取引を例にとってみよう。このようなシンボルを、GUIを使って手作業で1分以内に、あるいはスクリプトを使って1秒以内に作成する。


その上でアービトラージTSを実行する。

// シネティックス式アービトラージ・アドバイザー
#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (Bid > 1)
    OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0);
  else if (Ask < 1)
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    
}
 
CloseByによるシンボル・ポジションの迅速な決済

取引、自動取引システム、取引戦略のテストに関するフォーラム

複数の取引を一度に決済する

fxsaber, 2017.12.07 09:01

// MQL4&5コード
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

#property strict

string CorrectSymbol( string &Symb )
{
  return(Symb = ((Symb == NULL) || (Symb == "")) ? _Symbol: Symb);
}

bool PlaceHedge( const string Symb )
{
  double Lots = 0;
    
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Lots += OrderType() ? OrderLots() : -OrderLots();
      
  Lots = NormalizeDouble(Lots, 2);    
      
  return(((Lots > 0) && (OrderSend(Symb, OP_BUY, Lots, SymbolInfoDouble(Symb, SYMBOL_ASK), 100, 0, 0, "HEDGE") > 0)) ||
         ((Lots < 0) && (OrderSend(Symb, OP_SELL, -Lots, SymbolInfoDouble(Symb, SYMBOL_BID), 100, 0, 0, "HEDGE") > 0)) || !Lots);
}

bool CloseAll( string Symb = NULL )
{
  int Type = 0;
  long Ticket = 0;
  
  bool Res = PlaceHedge(CorrectSymbol(Symb));
  
  for (int i = OrdersTotal() - 1; !IsStopped() && Res && (i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
    {
      if (!Ticket)
      {
        Ticket = OrderTicket();
        Type = OrderType();
      }
      else if ((OrderType() != Type) && (Res = OrderCloseBy(Ticket, OrderTicket()) && PlaceHedge(Symb)))
      {
        Ticket = 0;       
        
        i = OrdersTotal();
      }
    }

  return(Res);
}

void OnStart()
{
  CloseAll();
}
 
fxsaber:
タイプミス


#define MODE_DIGITS    SYMBOL_TRADE_STOPS_LEVEL
#define MODE_DIGITS    SYMBOL_DIGITS



 
Kirill Belousov:

誤字

はい、この例には タイプミスがあります。フォーラムのエンジンがそれを許さないのです。

もちろん、例のタイプミスはライブラリ自体には影響しません。

 
fxsaber:

はい、その例には タイプミスがあります。フォーラムのエンジンがそれを許さないのです。

修正済み

 
o_o:

を訂正しました。

ありがとう!

 

mql4_to_mql5.mqhの インクルード。

double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));
     }

   return(-1);
  }
   return(0);
 
Kirill Belousov:

mql4_to_mql5.mqh エンクロージャ内

#include <MQL4_to_MQL5.mqh> // この例のみ

これはまさに例であり、説明の中のいくつかのEAを変換するためにのみ関連します。この議論では、ライブラリはMarketInfoや他のソリューションよりもはるかに優れていることが示されています。

説明の中に非常に重要な記述があり、モデレーターによって強調されています(私ではありません)。

警告。

ライブラリはMT4Orders.mqhという1つのファイルにのみ含まれています。他のファイルはすべて、ライブラリの使用例として添付されています。これらのファイルはライブラリを使用するために必要なものではありません。

 

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ: MT4Orders

fxsaber, 2017.09.03 18:52

// 変更リスト:
// 03.09.2017:
// 追加: OrderTicketOpen()を追加 - ポジション開始取引のMT5チケット
// OrderOpenReason() - MT5が取引を開始する理由 (ポジションを開く理由)
//OrderCloseReason() - MT5決済取引の理由 (ポジションを決済する理由)

アプリケーションの例

取引、自動取引システム、テスト取引戦略に関するフォーラム

最後の2つの注文

fxsaber, 2017.12.23 11:02

#include <MT4Orders.mqh>

// 理由によってクローズされた最後の金額トランザクションのチケットを返す
int GetLastHistoryPositions( long &Tickets[], int Amount = INT_MAX, const ENUM_DEAL_REASON Reason = DEAL_REASON_SL )
{
  int Count = ArrayResize(Tickets, 0);
  
  for (int i = OrdersHistoryTotal() - 1; (i >= 0) && (Count < Amount); i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == Reason))
      Tickets[ArrayResize(Tickets, ++Count) - 1] = OrderTicket();
  
  return(Count);
}

void OnStart()
{
  long Tickets[];
  
  // 直近の2件はSLでクローズ
  for (int i = GetLastHistoryPositions(Tickets, 2) - 1; i >= 0; i--)
    Print(Tickets[i]);
}
 

こんにちは!説明によると、「したがって、MT5 のSELECT_BY_TICKET モードでのOrderSelect は、(テスターでは)まれに MT4 で意図したものと異なるものを選択することがあります。「どのような場合か詳しく教えてください。