在贸易交易中的处理 - 页 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

关于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个相同交易的日志剪报。

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_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 从未说过--他是在交易所交易还是只做外汇净值。我坐在这里等待...

 
Vladimir Karputov:

我早就想把它搬走了--但@Ilya Child 从未说过他是在交易所交易还是只做外汇净值。我坐在这里等待...

符号:RTS-3.19是FORTS

 
prostotrader:

符号:RTS-3.19是FORTS

不明白。有一个证券交易所,有一个外汇。其他的东西都是不符合标准的。

 
Vladimir Karputov:

我不明白。有一个证券交易所,有一个外汇。其他的东西都是不符合标准的。

FORTS是RTS期货和期权--莫斯科交易所的 衍生品市场部分 :)

 
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交易飞来了,但没有出现任何头寸,并且在一个不存在的头寸上挂了牌。

已添加。

一笔Deal_add交易到了,但头寸没有出现,不存在的头寸上的挂单被放置。交易类型为卖出,订单类型为买入。尽管最初的限制是Sell_limit

 
fxsaber:

限制器本身,将需要TP/SL,可以部分执行。限制器形式的TP也是如此。例如,TP被执行三分之一的量 - SL必须减少相同的量。

总而言之,相当不愉快的逻辑是为了抓住所有的窍门。


该任务应在OnTrade中实施。它的实施应该不会太难。

任务

我们在净值上有挂单(可能是不同的方向和每种类型的任何数量)。每次初始挂单触发时,我们需要将其SL/TP设置为止损/限价挂单。那么SL/TP应该是相互依存的:一旦订单触发,第二个订单就被删除。初始和SL/TP挂单可以部分触发。专家顾问可以在任何时候重新加载,包括转移到另一个终端。


解决方案

#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


  }
}
原因: