新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1920

 
MrBrooklin #:

谢谢你的提示,阿列克谢!首先我会在这个主题中等待答案,但如果没有结果,我将转向错误、缺陷、问题 主题。

真诚的,弗拉基米尔。

在这个问题上,你不会从开发者那里得到任何答案。如果你发现了一个错误,确定它真的是一个错误,请向阿列克谢所代言的分支报告。没有必要指望版主在这方面采取行动--我们也是人,我们也有时没有时间。

 
Artyom Trishkin #:

你不太可能从这个主题的开发者那里得到任何答案。如果你发现一个错误,确保它真的是一个错误,向Alexey的分支机构报告。在这种情况下,没有必要期待版主的行动,我们也是人,我们也没有时间。

嗨,Artem!

一切都很清楚。

真诚的,弗拉基米尔。

 

下午好!!!!

这里有两个网格顾问的功能,第一个功能是利润计算,考虑到部分亏损订单的平仓。

//+----------------------------------------------------------------------------+
//| Калькуляция сетки ордеров                                                  |
//+----------------------------------------------------------------------------+
bool CalculiteProfit()
  {
   double oProfit=0,oLoss=0,percent;
   int i;
   nOrd=0;
   for(i = OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic || OrderType()>OP_SELL)
         continue;
      if(OrderProfit()>=0)
         oProfit += OrderProfit();
      else
        {
         oLoss+=OrderProfit();
         Ord_ticket[nOrd]=OrderTicket();
         Ord_lot[nOrd]=OrderLots();
         nOrd++;
        }
     }
   oLoss = MathAbs(oLoss+GetOrderSwap()+GetOrderCommission());
   if(oLoss>0)
      percent=oProfit/oLoss*100;
   else
      percent=100;
   if(percent<MinPercentForClose) //MinPercentForClose переменная из настроек 
      return(false);
   for(i=0; i<nOrd; i++)
     {
      Ord_lot[i]=(MathCeil((Ord_lot[i]*RowLots)*percent)/100)/RowLots;
     }
   return(true);
  }

第二个功能是关闭订单,部分关闭无利可图的订单

//+----------------------------------------------------------------------------+
//| Закрытие сетки ордеров при заданной команде с учетом части ордеров         |
//+----------------------------------------------------------------------------+
void ClosseAll()
  {
   int i,j,tkt;

   for(i = OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic)
         continue;
      tkt=OrderTicket();
      RefreshRates();
      if(OrderProfit()>=0)
        {
         if(OrderType() == OP_BUY)
           {
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, slip))
               Print("Не удалось закрыть ордера на покупку!");
           }
         else
            if(OrderType() == OP_SELL)
              {
               if(!OrderClose(OrderTicket(), OrderLots(), Ask, slip))
                  Print("Не удалось закрыть ордер на продажу!");
              }
        }
      else
         for(j=0; j<nOrd; j++)
            if(tkt==Ord_ticket[j])
              {
               if(OrderLots()<Ord_lot[j])
                  Ord_lot[j]=OrderLots();
               Ord_lot[j]=NRL(Ord_lot[j]);
               if(OrderType() == OP_BUY)
                 {
                  if(!OrderClose(OrderTicket(), Ord_lot[j], Bid, slip))
                     Print("Не удалось закрыть ордера на покупку!");
                 }
               else
                  if(OrderType() == OP_SELL)
                    {
                     if(!OrderClose(OrderTicket(), Ord_lot[j], Ask, slip))
                        Print("Не удалось закрыть ордер на продажу!");
                    }
               break;
              }
     }
  }

情况如下:如果我关闭一格订单,同时考虑到部分亏损订单的关闭,我得到的损失是由于一些需要关闭的手的四舍五入的结果

问题是,你是否可以用这两个函数来写一个计算亏损订单的函数,或者说是一个要平仓的订单的一部分。

如果是这样,请帮我写一下

谢谢你

 
EVGENII SHELIPOV #:

下午好!!!!

如果是这样,请帮助我写。

这不是一个好时机。

你是说为你写吗?

 
Andrey Sokolov #:

这不是一个好时代。

你是说为你写作?

不要把自己撕碎,亚历山大

 

迷失在初级的东西里。

我如何组织一个拖网姿势--共同指导,由于某些原因,它拖网一个姿势,即它不拖网...MT5

for (i=0; i<PositionsTotal(); i++)   
     if (a_position.Select(_Symbol))       
     if (PositionSelect(_Symbol)) if(Symbol()==PositionGetSymbol(i))  
     if (Magic==PositionGetInteger(POSITION_MAGIC))  
   //  magic = myposition.Magic();   
      {
         //  ------------   перевод в бу  BUY   ------------    
         //if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 
         if (a_position.PositionType() == POSITION_TYPE_BUY)
          if (NLb_fun > 0)
            {
                Print(" перевод в безубыток BUY, _SL = ", _SL, " POSITION_PRICE_OPEN: ",
                     NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits),
                     " NLb_fun = ", NormalizeDouble(NLb_fun,_Digits));
               Modify = true;
 if(Modify)
              {
               Print(" серия рыночных позиций BUY назначена к переводу в безубыток, текущией позы POSITION_PRICE_OPEN = ",
               NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits)," тикет = ",PositionGetInteger(POSITION_TICKET));
                
               trade.PositionModify(_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_BID) - 50*_Point,PositionGetDouble(POSITION_TP));
               Print(" Перенос в бу стоп лосса позиции Buy № ",  PositionGetInteger(POSITION_TICKET));
    ...
           } // к if(Modify)
        }    // к if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 

...

我可以用一个简单的代码部分来列举HEDGE市场头寸的拖网 - 谢谢你。

问题解决了!再次祝贺弗拉基米尔-卡尔普托夫!!。

与他的拖网!

https://www.mql5.com/ru/code/17263

关键的诀窍是看循环中的索引,然后用票据选项修改它!!。

//--- при таком методе мы будет сюда попадать на каждом тике.
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
           {
            //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 } 
TrailingStop
TrailingStop
  • www.mql5.com
Пример советника с реализацией Trailing Stop.
 

一个简单的任务:你需要从ArrayJ中撞出所有与ArrayI的元素 具有相同索引和值的元素。

int OnInit()
  {
   int CommonArray[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 13, 13};
   int ArrayI[20]=   {0, 0, 0, 0, 0, 0, 0, 8, 9, 10,  0, 12, 13, 13, 13, 13,  0,  0, 13,  0};
   int ArrayJ[];

   for(int j=0; j<ArraySize(ArrayI); j++)
   {
      ArrayResize(ArrayJ,j+1);
      ArrayJ[j]=CommonArray[j];
   }

   ArrayPrint(ArrayI);
   ArrayPrint(ArrayJ);

   for(int i=0; i<ArraySize(ArrayI); i++)
      if(ArrayI[i])
         for(int j=0; j<ArraySize(ArrayJ); j++)
            if(ArrayI[i]==ArrayJ[j])
               ArrayRemove(ArrayJ,j,1);

   ArrayPrint(ArrayJ);
//---
   return(INIT_SUCCEEDED);
  }

关键字符串被高亮显示。结果。

2022.02.26 13:56:48.489 test (NZDUSD,H4)         0  0  0  0  0  0  0  8  9 10  0 12 13 13 13 13  0  0 13  0
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7  8  9 10 11 12 13 13 13 13 13 13 13 13
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7 11

预期的。

2022.02.26 13:56:48.489 test (NZDUSD,H4)         0  0  0  0  0  0  0  8  9 10  0 12 13 13 13 13  0  0 13  0
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7  8  9 10 11 12 13 13 13 13 13 13 13 13
2022.02.26 13:56:48.489 test (NZDUSD,H4)         1  2  3  4  5  6  7          11                13 13    13

ArrayJ是动态的,似乎有什么问题......。但我也不需要一个静态的。

打破了我的想法。怎么了?或者说,这相当于那首老歌。

https://www.mql5.com/ru/forum/1111/page3141#comment_27152680

и

https://www.mql5.com/ru/forum/1111/page3142#comment_27371998

关于命名的常数?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2022.01.28
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
x572intraday ArrayI的元素 具有相同索引和值的元素。

关键字符串被高亮显示。结果。

预期的。

ArrayJ是动态的,似乎有什么问题......。但我也不需要一个静态的。

1.ArrayResize最好移出循环。

ArrayResize(ArrayJ,ArraySize(ArrayI));
for(int j=0; j<ArraySize(ArrayI); j++)
   {
      ArrayJ[j]=CommonArray[j];
   }

2.ArrayRemove不会使一个数组元素变 "空",而是将后续元素 "移 "到它的位置上。因此,后续索引中元素的匹配被打破。

 
JRandomTrader #:

1.ArrayResize应该被移出循环。

2.ArrayRemove不会使一个数组元素变 "空",而是在其位置上 "转移 "后续元素。因此,后续索引中元素的匹配被打破。

对2没有疑问,我只是把间隔放在那里,使之更清晰。此外,在Help中提到了静态数组:"如果该函数用于固定大小的数组,那么数组大小本身不会改变:剩余的 "尾巴 "被物理复制到 起始位置 " 帮助中的例子也使用了一个固定大小的数组,而我有一个动态数组。

Re 1.我们不能把它放在循环之外,因为在一个真正的任务中,我们事先不知道ArrayJ或ArrayI的大小,更不知道CommonArray的大小,因为它们都不重合。

我还有一个例子,元素洗牌并没有像上面的例子那样在中途中断。

int OBJTFVArray[]={1, 2, 3, 4, 5, 6, 10, 12, 1520, 30, 16385, 16386, 16387, 16388, 16390, 16392, 16396, 16408, 32769, 49153, 49154, 49155, 49156, 49157, 49158, 49159, 49160};
int PArray[20]={0, 0, 0, 0, 0, 00, 16390, 16392, 163960, 32769, 49153, 49153, 49153, 49153, 0, 0, 49153, 0};
int PArray_[];

int OnInit()
  {
   for(int p_=0; p_<ArraySize(PArray); p_++)
   {
      ArrayResize(PArray_,p_+1);
      PArray_[p_]=OBJTFVArray[p_+8];
   }

   ArrayPrint(PArray);
   ArrayPrint(PArray_);

   for(int p=0; p<ArraySize(PArray); p++)
      if(PArray[p])
         for(int p_=0; p_<ArraySize(PArray_); p_++)
            if(PArray[p]==PArray_[p_])
               ArrayRemove(PArray_,p_,1);

   ArrayPrint(PArray_);

   return(INIT_SUCCEEDED);
  }

结果是好的。

 0     0     0     0     0     0     0 16390 16392 16396     0 32769 49153 49153 49153 49153     0     0 49153     0
15    20    30 16385 16386 16387 16388 16390 16392 16396 16408 32769 49153 49154 49155 49156 49157 49158 49159 49160
15    20    30 16385 16386 16387 16388                   16408             49154 49155 49156 49157 49158 49159 49160

但你需要那个变体来工作。如果在右边的尾巴上有相同值的元素(见前文),显然会出现这种阻碍--这与我上面提到的问题类似。

 
x572intraday #:

关于2没有问题,我把间隔放在这里是为了明确。此外,在《帮助》中提到了静态数组:"如果该函数用于固定大小的数组,那么数组本身的大小不会改变:它将剩余的 "尾巴 "物理性地复制到 起始位置 " 帮助中的例子也使用了一个固定大小的数组,而我有一个动态数组。

关于1.我们不能把它放在循环之外,因为在一个真正的任务中,我们事先不知道ArrayJ或ArrayI的大小,更不知道CommonArray的大小,因为它们都不重合。

我还有一个例子,元素洗牌并没有像上面的例子那样在中途中断。

结果是好的。

但我需要那个变体来工作。如果在右边的尾巴上有相同值的元素,显然会出现这种阻碍(见前文)--这与我上面提到的问题类似。

1.你可以而且应该把它从循环中取出来,就像我所展示的方式。除非ArrayI的大小在循环中发生变化。

2.那么像这样的事情

int k=0; // объявляем до цикла - чтобы использовать после
for(int i=0; i<ArraySize(ArrayI); i++) // после предыдущего кода (1) размеры ArrayI и ArrayJ равны
  if(ArrayI[i]!=ArrayJ[i])
    {
     ArrayJ[k++]=ArrayI[i];
    }
ArrayResize(ArrayJ,k);
原因: