在测试器中进行清算 - 页 6

 
Roman Shiredchenko #:

还有一个组织问题,如果有人知道如何以最好的方式解决它--请用文字写出来,我会用代码写出来。

在一般情况下,如何理解订单周期,一个新的位置 - PROFIT已经开始 - 考虑到位置的平均开盘价(清除改变其价值)。

要清楚的是,我既可以从终端通过钥匙自己,也可以通过机器人与Magik....。

一般来说,我需要一个报告点--计算头寸的平均进入价格。

我是否可以使用这里的数据+例如读取前一个仓位盈利的时间,并从那里获取与真实服务器时间的差异,就像我从终端开始一个周期一样--没有机器人。

我的意思是像这样的事情。

如过去的头寸在加号中--那么当前的周期核算已经开始了。而订单--你必须已经计算了进场价格和成交量,以计算总头寸的平均进场价格...

https://www.mql5.com/ru/articles/211


--------------------------------------------------------------

当然,理想的情况是,无论前一个周期的结果如何--盈利或亏损,都应该关闭。

开始--新的在代码中被标记为计算--新的当前周期的平均价格,例如,或填补--这并不重要......

有没有人准备好计算最终仓位的平均价格?我已经厌倦了计算和纠正代码 - 石头花不工作....:-)

我在OnTrade Transaction ()中尝试了不同的方法--许多额外的东西进入了计算,结果是很多东西被翻倍--这是不对的。

活动

"例如,当发送一个市场买入订单时,它被处理,为账户创建一个适当的买入订单,订单被执行,从开放的列表中删除,添加到订单历史中,然后在历史中添加一个适当的交易,并创建一个新的位置。所有这些行为都是贸易交易

"

这是通过On Trade Transaction ()

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {


 if ((Hour() <= 13 && Minute() < 44) || (Hour() >=14 && Minute() > 5) || 
          (Hour() <= 18 && Minute() < 44) || (Hour() >=19 && Minute() > 5)) 
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)   //TRADE_TRANSACTION_DEAL_ADD)
   
     {
      long deal_type = -1;
      long deal_entry = -1;
      long deal_magic = 0;

      double deal_volume = 0;
      double deal_price  = 0;
      string deal_symbol = "";

      if(HistoryDealSelect(trans.deal))
        {
         // Print(" deal_entry == DEAL_ENTRY_IN, last_price = ",last_price, " last_lots = ",last_lots);

         deal_type    = HistoryDealGetInteger(trans.deal, DEAL_TYPE);
         deal_entry   = HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
         deal_magic   = HistoryDealGetInteger(trans.deal, DEAL_MAGIC);

         deal_volume  = HistoryDealGetDouble(trans.deal, DEAL_VOLUME);
         deal_price   = HistoryDealGetDouble(trans.deal, DEAL_PRICE);
         deal_symbol  = HistoryDealGetString(trans.deal, DEAL_SYMBOL);
         Print(" deal_entry == DEAL_ENTRY_IN, deal_price = ", deal_price, " deal_volume = ", deal_volume);
        }
      else
         return;

      if(deal_symbol == _Symbol) // && deal_magic == MagicNumber)

         if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
           {
            // last_price    = deal_price;
            last_pos_type = (deal_type == DEAL_TYPE_BUY) ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
            // last_lots     = deal_volume;


          
            if (deal_type == DEAL_TYPE_BUY)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY   && 
                 NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) < last_price))
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_BUY: last_price_BUY = ",last_price, " last_lots_BUY = ",last_lots, " N_max_B = ", N_max_B);
           }
           
         if (deal_type == DEAL_TYPE_SELL)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||                
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL &&
                   (NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) == 0 ||
                    NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) > last_price ))) 
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_SELL: last_price_SELL = ",last_price, " last_lots_SELL = ",last_lots, " N_max_S = ", N_max_S);
           }   
           
         } // к if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
     }
  }

在这种f-i-手的情况下,平均入仓价格的计算(净值化)是不正确的。


通过On Trade来做可能会更容易。

我现在通过On Trade()来看:这里解释了一切,我们只需在代码中插入计算,就可以了......基本上。

https://www.mql5.com/ru/articles/40


基本上,设计是这样的--如果有增加的头寸,那么就会计算出平均价格。当位置被关闭时,所有的中间变量必须被清零。基本上,那里的一切都很初级。

其任务是排除清算期间头寸开盘价的变化(当它变成等于清算时的符号价格)。

即在代码中读取它。

Обработка торговых событий в эксперте при помощи функции OnTrade()
Обработка торговых событий в эксперте при помощи функции OnTrade()
  • www.mql5.com
В 5-ой версии языка MQL появилась масса нововведений, в том числе работа с событиями различных типов (события таймера, торговые события, пользовательские и т.д.). Возможность обработки событий позволяет создавать совершенно новый тип программ для автоматического и полуавтоматического трейдинга. В этой статье мы рассмотрим торговые события и напишем для функции OnTrade() код, который будет обрабатывать событие Trade.
 
Roman Shiredchenko #:

没有人有一个现成的设计来计算最终头寸的平均价格?我已经厌倦了计算和纠正代码--它不起作用....:-)

这是我的一段旧的,但仍然 "战斗 "的代码。

               Pr=HistoryDealGetDouble(DealTicket,DEAL_PRICE);
               Vol=HistoryDealGetDouble(DealTicket,DEAL_VOLUME);
               if(st.Pos==0.0)
                  st.Price=Pr;
               if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_BUY)
                 {
                  if(st.Pos>=0.0) // Увеличиваем лонг
                     st.PriceAvr=(st.PriceAvr*st.Pos+Pr*Vol)/(st.Pos+Vol);
                  else  // st.Pos<0
                    {
                     if(Vol<=-st.Pos) // Кроемся или сокращаем позу
                        Res=(-Vol)*(Pr-st.PriceAvr);
                     else if(Vol>-st.Pos) // Переворот в лонг
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos+=Vol; st.PlanPos-=Vol;
                 }
               else if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_SELL)
                 {
                  if(st.Pos<=0.0) // Увеличиваем шорт
                     st.PriceAvr=(st.PriceAvr*(-st.Pos)+Pr*Vol)/(-st.Pos+Vol);
                  else  // st.Pos>0
                    {
                     if(Vol<=st.Pos) // Кроемся или сокращаем позу
                        Res=(Vol)*(Pr-st.PriceAvr);
                     else if(Vol>st.Pos) // Переворот в шорт
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos-=Vol; st.PlanPos+=Vol;
                 }
 
JRandomTrader #:

这是我的一段旧的但仍然 "可操作 "的代码。

非常感谢你这么快的回复--我会拿去审查和编辑。
 
Roman Shiredchenko #:
非常感谢你这么快的回复--我会把它拿上去审查和编辑。

注意--"st"(有相当大的结构,包括轨迹和统计)正是机器人的 "状态"--在变化后(和deinit时)被转储到磁盘,并在yinit时被加载。

是的,很可能st.Price和st.PriceAvr在这里并不是真的需要,一个就够了,但是代码是旧的,超过5年了,而且我所有的 "战斗 "机器人都和它联系在一起,所以 "航空机械学的第一条规则--不要乱用工作机制"。

 

清算的结果是将所有头寸转移到当前价格,即转移到价差内的平均价格。

谁关心这个交流?

 
JRandomTrader #:

注意--"st"(有相当大的结构,包括轨迹和统计)正是机器人的 "状态"--在变化后(和deinit时)被转储到磁盘,并在yinit时被加载。

是的,很可能st.Price和st.PriceAvr在这里并不是真的需要,一个就够了,但是代码是旧的,超过5年了,而且我所有的 "战斗 "机器人都和它联系在一起,所以 "航空机械学的第一条规则--不要乱用工作机制"。

谢谢你的澄清,我会把它作为基本的。
 
Renat Akhtyamov #:

清算的结果是将所有头寸转移到当前价格,即转移到价差内的平均价格。

谁关心这个交流?

我一做完就会把文件贴在这里。
 
Renat Akhtyamov #:

清算的结果是将所有头寸转移到当前价格,即转移到价差内的平均价格。

谁会关心交易所的情况?

我只在交易所进行交易。

 
JRandomTrader #:

我只在证券交易所进行交易。

而且我只做外汇交易。

我不知道如何交易股票市场。

我一直在那里,我一直在那里。

不是我的事 - 重新学习

顺便问一下,为什么市场上的平均价格不是清算后的价格?

//否则我就在那里交易;)

//但事实证明,他们并没有把一切都交给玻璃,而是把它隐藏起来,也就是说,玻璃很糟糕?

 
Roman Shiredchenko #:
我一写完小说就会在这里发表。

所有的东西都已经在交易所交易部分张贴了很久了

https://www.mql5.com/ru/forum/67298/page3#comment_2109451

ФОРТС: В помощь начинающим
ФОРТС: В помощь начинающим
  • 2015.12.08
  • www.mql5.com
Установка отложенного ордера командой OrderSend().