OnTradeTransaction処理 - ページ 3

 
Илья Ребенок:

この場合、やはり依頼主からの注文のチケットをどこかに保存して、取引からのチケットと比較する必要があります。また、ローカル 変数の保存から解放され、マーケットやターミナルからの情報のみで、ローカルなインフラリスクを平準化したいのです。

ちょっと甘えすぎですね。

魔導師は、このEAのすべてのトレードで同じです

でも、オーダーが違う(ユニーク)!?

 
prostotrader:

Openvashkaでリアルで取引し、デモでテストしていますが、トリガーを複数持っていないのですが、どうしたらいいですか?

TRADE_TRANSACTION_DEAL_ADDの コードを投稿してください。

今日、ちょうどこんなことがあったんです。上記は、同じロボットに対して2つの同じ取引を行った際のログからの抜粋です。

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD。
貿易取引取引追加
シンボル:RTS-3.19
ディールチケット:12674810
ディールタイプ:DEAL_TYPE_BUY
注文書:82646001
オーダータイプ:ORDER_TYPE_BUY
注文状態:ORDER_STATE_STARTED
オーダー時間タイプ:ORDER_TIME_GTC
注文有効期限:1970.01.01 00:00
価格:119700
価格トリガー:0
ストップロス:0
テイクプロフィット:0
巻数:1巻
ポジション:82646001
ポジション別:0

2019.02.08 10:55:32 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD。
貿易取引取引追加
シンボル:RTS-3.19
ディールチケット:12674810
ディールタイプ:DEAL_TYPE_BUY
注文書:82646001
オーダータイプ:ORDER_TYPE_BUY
注文状態:ORDER_STATE_STARTED
オーダー時間タイプ:ORDER_TIME_GTC
注文有効期限:1970.01.01 00:00
価格:119700
価格トリガー:0
ストップロス:0
テイクプロフィット:0
巻数:1巻
ポジション:82646001
ポジション別:0

コード on deal_add

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

同じトランザクションが2つあるバグがあったので、現在のトランザクションのチケットが前のトランザクションと等しくないというチェックを追加しました。

 
Илья Ребенок:

今日、ちょうどこんなことがあったんです。上記で、同じロボットの同じ取引を2回行ったときのログを切り取ったものを掲載しました。

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD。
貿易取引取引追加
シンボル:RTS-3.19
ディールチケット:12674810
ディールタイプ:DEAL_TYPE_BUY
注文書:82646001
オーダータイプ:ORDER_TYPE_BUY
注文状態:ORDER_STATE_STARTED
.........

deal_addに対応するコード

同じトランザクションが2つあるバグがあったので、現在のトランザクションのチケットが前のトランザクションと等しくないというチェックを追加しました。

了解です。

注文状態:ORDER_STATE_STARTED -これはTRADE_TRANSACTION_DEAL_ADDには ない!

追加

そんなことはないだろう(イリヤ・バラノフも そうだ)。

switch(trans.type)
  {
    case TRADE_TRANSACTION_DEAL_ADD:
    //Place you code here
    break;  
  }

追加

このフォーラムは、 "為替取引 "のセクションを持っているあなたは、より良いそこに通信することをお勧めします...

 
prostotrader:

なるほど。

注文状態:ORDER_STATE_STARTED - これは TRADE_TRANSACTION_DEAL_ADDにはない!

追加

そんなことはないでしょう。

追加

このフォーラムは、 "為替取引 "のセクションを持っているあなたは、より良いそこに通信することをお勧めします...

私はとっくに動かしているのですが、@Ilya Childは、取引所で取引しているのか、それともFXのネッティングだけなのか、言っていません。私はここに座って待っている...

 
Vladimir Karputov:

とっくに動かしているはずなのですが......@イリヤ・チャイルドは 取引所で取引しているのか、FXのネッティングだけなのか、一度も言っていません。私はここに座って待っている...

記号:RTS-3.19はFORTS

 
prostotrader:

記号:RTS-3.19はFORTS

理解 できない。証券取引所があり、FXがある。それ以外は全部外れです。

 
Vladimir Karputov:

理解 できない。証券取引所があり、FXがある。それ以外は全部外れです。

FORTSはRTS Futures and Optionsの略で、モスクワ証券取引所の デリバティブ市場部門です :)

 
prostotrader:

なるほど。

注文状態:ORDER_STATE_STARTED -これはTRADE_TRANSACTION_DEAL_ADDには ない!

追加

そんなことはないだろう(イリヤ・バラノフも そうだ)。

追加

このフォーラムに「為替取引」のセクションがあるので、そこでコミュニケーションした方が良いのでは...。

よくわからないんですけど。ここでは、トランザクションの処理をしています。

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

取引における注文の状況について。自分で作っているわけではないことは分かっているはずだ。すべての deal_add トランザクションで、これは注文のステータスとなります。成行注文であり、以前は保留注文であったことにご注意ください。

今度は別の部分で混乱が起きています。deal_addのトランザクションが飛んできて、ポジションが表示されず、存在しないポジションのpendingが置かれた。

追加されました。

Deal_add 取引が到着したが、ポジションが表示されず、存在しないポジションの保留注文が発注された。取引形態は「売り」、注文形態は「買い」です。当初はSell_limitで制限していましたが

 
fxsaber:

TP/SLが必要となるリミッター自体は、部分的に実行される場合があります。リミッターの形をしたTPは同じです。例えば、TPを3分の1の量で実行する場合、SLも同じだけ減らさなければなりません。

全体として、すべてのトリックをキャッチするためのかなり不快なロジックです。


このタスクはOnTradeに実装する必要があります。実装はそれほど難しくないはずです。

タスク

ネッティングの注文を保留している(異なる指示の場合もあり、各タイプの数は任意)。最初の保留注文がトリガーされるたびに、そのSL/TPをStop/Limit保留注文として設定する必要があります。そうすると、SL/TPは相互依存であるべきで、一旦注文がトリガーされると、2番目の注文は削除されます。イニシャルとSL/TPの保留注文は、部分的に発動することができます。Expert Advisor は、他のターミナルへの転送を含め、いつでも再ロードすることができます。


解決方法

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input int inTP = 100;
input int inSL = 200;
sinput MAGIC_TYPE inMagicNumber = 0;
sinput string inStrKey = "SLTP";

int GetAmountDeals()
{
  return(HistorySelect(0, INT_MAX) ? HistoryDealsTotal() : 0);
}

bool IsMyString( const string Str, const string Key )
{
  return(StringSubstr(Str, 0, StringLen(Key)) == Key);
}

string ToMyString( const string Str, const string Key )
{
  return(Key + Str);
}

struct ORDER
{
  int Type;
  TICKET_TYPE Ticket;
  double Lots;
  double OpenPrice;
  MAGIC_TYPE Magic;
  string Comment;
  
  ORDER() : Type(OrderType()), Ticket(OrderTicket()), Lots(OrderLots()),
            OpenPrice(OrderOpenPrice()), Magic(OrderMagicNumber()), Comment(OrderComment())
  {
  }
};

#define _CS(A) ((!::IsStopped()) && (A))

bool GetPairOrder()
{
  bool Res = false;

  ORDER Order;
  Order.Type = 6 - Order.Type + ((Order.Type & 1) << 1);
  
  for (int i = OrdersTotal() - 1; _CS((i >= 0) && (!Res)); i--)
    Res = OrderSelect(i, SELECT_BY_POS) && (OrderType() == Order.Type) &&
          (OrderMagicNumber() == Order.Magic) && (OrderComment() == Order.Comment);
    
  return(Res);
}

void CheckSLTP( const string Symb, const MAGIC_TYPE Magic, const string Key, const int Slip = 100 )
{    
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() > OP_SELL)  &&
        (OrderMagicNumber() == Magic) && (OrderSymbol() == Symb) && IsMyString(OrderComment(), Key))
    {
      const ORDER Order;      
      
      if (!_CS(GetPairOrder()))
      {
        OrderDelete(Order.Ticket);
        
        i = OrdersTotal();
      }
      else if (_CS(OrderLots() < Order.Lots))
      {
        if (OrderDelete(Order.Ticket))
          OrderSend(OrderSymbol(), Order.Type, OrderLots(), Order.OpenPrice, Slip, 0, 0, Order.Comment, Order.Magic);
          
        i = OrdersTotal();          
      }
    }
}

void CheckFill( const string Symb, const MAGIC_TYPE Magic, const string Key, const int SL, const int TP )
{    
  static int PrevDeals = GetAmountDeals();
  
  const double point = SymbolInfoDouble(Symb, SYMBOL_POINT);
  const int NewDeals = GetAmountDeals();
  
  while (_CS(PrevDeals < NewDeals))
  {
    const ulong Ticket = HistoryDealGetTicket(PrevDeals);
    
    if (Ticket && (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == Magic) &&
                  (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb) &&
                  !IsMyString(HistoryDealGetString(Ticket, DEAL_COMMENT), Key))
    {
      const double Lots = HistoryDealGetDouble(Ticket, DEAL_VOLUME);
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE);
      const int Type = 1 - (int)HistoryDealGetInteger(Ticket, DEAL_TYPE);
      const double Koef = Type ? -point : point;
      const string Comment = ToMyString((string)Ticket, Key);
      
      if (OrderSend(Symb, Type + OP_BUYLIMIT, Lots, Price - Koef * TP, 0, 0, 0, Comment))
        OrderSend(Symb, Type + OP_BUYSTOP, Lots, Price + Koef * SL, 0, 0, 0, Comment);
    }
    
    PrevDeals++;
  }
}

void System()
{
  CheckFill(_Symbol, inMagicNumber, inStrKey, inSL, inTP);
  CheckSLTP(_Symbol, inMagicNumber, inStrKey);
}

void OnTrade()
{
  System();
}

void OnInit()
{
  OnTrade();
}
 
Илья Ребенок:

よくわからないんですけど。以下は私のトランザクション処理です。


switch(trans.type)を持っていない。

void OnTradeTransaction( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{
  switch(trans.type) //<<---- ОТФИЛЬТРОВАТЬ ПО ТИПУ ТРАЗАКЦИИ!!!!!!!!!!!!!!!!!!!!!!
  {
   //А вот здесь уже TRADE_TRANSACTION_DEAL_ADD


  }
}