初学者的问题 MQL5 MT5 MetaTrader 5 - 页 828

 
问候。这个问题更像是一个逻辑性问题。
所谓的反马太效应系统,对增加的数量有限制。如果你获利平仓,下一手就会增加一个系数。如果出现亏损,或者连续盈利的头寸数量超过指定数量,那么手数就等于起始手数。
一旦超过了指定的盈利头寸数量,我如何再次开始增加的循环?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
问候。这个问题更像是一个逻辑性问题。
所谓的反马太效应系统,对增加的数量有限制。如果你获利平仓,下一手就会增加一个系数。如果出现亏损,或者连续盈利的头寸数量超过指定数量,那么手数就等于起始手数。
一旦超过了指定的盈利头寸数量,我如何再次开始增加的循环?


/

止损止盈 代码中的例子:手数大小存储在 "ExtLot "变量中(覆盖、增加和重置为最小值),该变量在全局程序级别(头文件中)声明。OnTradeTransaction()捕捉 "市场退出 "类型的交易,并检查交易是如何关闭的--在获利或止损。

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

如果是止损,我们就将手数加倍如果是止盈,我们就将手数重置为最小值。


注意:在专家顾问本身中,止损和止盈的计算有点不正确 - 但代码将很快重新发布。

 
Vladimir Karputov:

止损止盈 代码中的例子:手数大小被存储(覆盖、增加和重置为最小值)在全局程序级别(在标题中)声明的 "ExtLot "变量中。OnTradeTransaction()捕捉 "市场退出 "类型的交易,并检查交易是如何关闭的--在获利或止损。

如果是止损,我们就将手数加倍如果是止盈,我们就将手数重置为最小值。


注意:在专家顾问中,止损和止盈的计算略有不妥 - 但很快就会重新发布代码。

我计算连续进行的盈利交易的数量,如果超过5个,那么我就回到初始手数,第6个仓位用初始手数开仓,第7个仓位应该 用成交量=手数6乘以系数开仓,等等。当有5个更有利可图的头寸时,再回到最初的手数。

盈利的头寸是连续的20个。他们的地段应该是1、2、4、8、16、1、2、4、8、16、1、2、4、8、16、1、2、4、8、16


 
lil_lil:

我计算连续盈利的交易次数,如果超过5次,那么我就回到初始手数,6号仓以初始手数开仓,7号仓应 以成交量=6号仓乘以系数开仓,等等。当有5个更有利可图的头寸时,再回到最初的手数。

盈利的头寸是连续的20个。他们的地段应该是1、2、4、8、16、1、2、4、8、16、1、2、4、8、16、1、2、4、8、16


你需要在手数函数中使用一个静态变量。下面是它的工作原理。

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   static int counter=0;
   for(int i=0;i<18;i++)
     {
      Print(counter);
      counter++;
      if(counter==5)
         counter=0;
     }
  }
//+------------------------------------------------------------------+

结果。

0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
附加的文件:
Test_1.mq5  2 kb
 
Vladimir Karputov:

你需要在手数函数中使用一个静态变量。以下是它的工作原理。

结果。

我根据你的例子进行了重置,但我无法得到批次增加的顺序

有20个有利可图的位置,连续不断。他们的地段应该是1,2,4,8,16,1,2,4,8,16,1,2,4,8,16,1,2,4,8,16, 但是应该是1,2,4,8,16,1,1,1,1,............

有什么问题吗?

int K_U_=5;  double   Lots=1.0;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit(const string Symb,const long MagicNumber=0)
  {
    int counter=0;
   ulong Ticket;

   if(HistorySelect(0,LONG_MAX))
      for(int i=HistoryDealsTotal()-1; i>=0; i--){
      
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {
            if(HistoryDealGetDouble(Ticket,DEAL_PROFIT)>0)
            counter++; else
               break;
           }
           }
   if(counter==K_U_)
      counter=0;
   return(counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos(const string Symb,const long MagicNumber=0)
  {
   ulong Ticket;
   double lot_=0;

   if(HistorySelect(0,LONG_MAX))
      for(int i=0; i<HistoryDealsTotal(); i++)
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {

            lot_=HistoryOrderGetDouble(Ticket,ORDER_VOLUME_INITIAL);

           }

   return(lot_);
  }
 
lil_lil:

我正在根据你的例子进行归零,但我没有得到批次增加的顺序。

有20个有利可图的位置,连续不断。他们的地段应该是1,2,4,8,16,1,2,4,8,16,1,2,4,8,16,1,2,4,8,16, 结果是这样的1,2,4,8,16,1,1,1 ............

怎么了?

所以你还是不想以正常方式使用OnTradeTransaction?那么,你更愿意要求精确地记录整个交易历史(自1970年以来)?为什么?

 
Vladimir Karputov:

所以你不希望与OnTradeTransaction 正常工作?所以你更愿意要求所有的交易历史(自1970年以来)?为什么?

找到了一个理由,托架。

你说我不想是什么意思,OnTradeTransaction 与我的问题有什么关系;)

 

现在,我看到,在我的问题之前的两个帖子,有一个计算的例子。

谢谢你。

 
lil_lil:

找到了原因,托架。

你说我不想是什么意思,OnTradeTransaction 与我的问题有什么关系;)

只是要求提供交易记录

HistorySelect(0,LONG_MAX)

意味着请求获得该交易账户自1970年以来的所有、所有、所有的历史记录。这是非常次优的。

  • 如果该账户有成千上万的交易怎么办?
  • 如果(上帝保佑)你在每一次打勾时都提出这样的要求呢?

 

请分享与交易历史相关的功能。

我需要获得有关最后一笔交易的开盘、收盘、成交量、财务结果及其类型(买入或卖出)的信息。

如果你有任何类似的功能,请分享。