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

 
MakarFX #:

这些图书馆到底能不能用?

我在网上某处看到一个关于如何拆解这东西的视频,但它在创建时需要打开一些东西,不管是头文件还是其他东西。我在64KA上重新编译了代码,它成功了。好吧,事实证明,在64卡上,8字节的指针已经被看得不是很严重了,而且可能还有其他关键性的差异,人们应该大力发挥这个问题。我只是想用32位编译器来进行调试,我有一些专门为它们设计的想法。

 
你能告诉我为什么双数0.00134不能被30除以?
,它给出了一个整数和小数点后的无穷大数
,它应该是大约0.00004
 
Ivan Butko #:
你能告诉我为什么双数0.00134不能被30除以? ,它给出了一个整数和小数点后的无穷大数 ,它应该是大约0.00004

Print( DoubleToString(0.00134/30) ); 0.00004467

 
Vitaly Muzichenko #:

维塔利,如果你不打印,内部计算会不会显示0.00004....或5.666666.....e ?
或者说是同样的事情?
 
Ivan Butko #:
维塔利,如果你不打印它,在内部计算中会不会是0.00004....?或5.666666.....e ?
或者说是同样的事情?

内部计算只包括这个(一个八字节的十六进制整数)。

https://ru.wikipedia.org/wiki/Число_двойной_точности

0.00004467 = 0x3f076b81834d51ed
 
你好!有谁知道从MT4到快速 交易所的交易的合理复制器吗?
 

下午好。帮助


我有一个代码,没有检查是否存在未结订单。

根据规定的逻辑打开订单,但同时打开买入和卖出订单。

void OnTick()
{
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment( 
  "\n",                      name,
  "\n", 
  "Символ ",                 Symbol(),  
  "\n",
  "Тайм Фрейм ",             Period(),
  "\n",                      AccountCompany(),
  "\n",
  " ",                       AccountServer(),
  "\n", 
  "Lots",                    Lot,
  "\n",
  "Объем в бай ",            "BuyLots()",
  "\n", 
  "Объем в сел ",            "SellLots()",
  "\n",
  "Price ",                  Bid,
  "\n", 
  "Дата ",                   TimeToString( TimeCurrent(), TIME_DATE ),
  "\n",
  "Server Time ",            TimeToString( TimeCurrent(), TIME_SECONDS ),
  "\n", 
  "\n", "Процент просадки ", NormalizeDouble(  (AccountInfoDouble(ACCOUNT_BALANCE)-AccountInfoDouble(ACCOUNT_MARGIN_FREE))/AccountInfoDouble(ACCOUNT_BALANCE)*100, 
  2)/*, "\n" //"  CalcTP() ", CalcTP(),
,  "  t_p $ ", t_p, "  Profit() $ ", Profit(), "\n",  */); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   /*if (CountTrades() == 0 && TypeOrder(OP_BUY) && TypeOrder(OP_SELL))
      {*/
       double body = Close[1] - Open[1];
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
//Открытие позиции Buy
    if (body > 0)
       {
        Forder = (OrderSend(_Symbol,OP_BUY,Lot,Ask,iSlippage,0,0,"Коммент",Magic,0,Blue));
        if(Forder > 0)
          {
           Print("Открыта Позиция BUY");
           if(OrderSelect(Forder, SELECT_BY_TICKET))
             {
              TP = NormalizeDouble((Ask+iTakeProfit*_Point),_Digits);
              if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
                 Print("Ордер Модифицирован BUY "); 
              else 
                 Print("Ошибка Модификации Ордера BUY = ",GetLastError());
             }
          }Print("Ошибка Открытия Позиции BUY");
       }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
//Открытие позиции Sell      
    if (body < 0)
       {
        Forder = (OrderSend(_Symbol,OP_SELL,Lot,Bid,iSlippage,0,0,"Коммент Sell",Magic,0,Red));
        if (Forder > 0)
           {
            Print("Открыта Позиция SELL");
            if(OrderSelect(Forder, SELECT_BY_TICKET))
              {
               TP = NormalizeDouble((Bid-iTakeProfit*_Point),_Digits);
               if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
                   Print("Ордер Модифицирован SELL "); 
               else 
                   Print("Ошибка Модификации Ордера SELL = ",GetLastError());
              }
           }Print("Ошибка Открытия Позиции SELL");
       }
     }  
 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//      
  /* else 
   {
   
   }*/
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
/*}*/

我们将与这些订单一起工作。

//它不需要检查订单,如果它是开放的。


如果你启用了检查功能,那么订单就不会像我们希望的那样被打开。
如果我们想避免反订单,我们应该检查第一个被打开的订单,然后打开相同的类型,直到最后一个订单类型被关闭,然后再回到检查打开条件的逻辑。

int TypeOrder(int OrType)
{
 int count = 0;
  for(int i = OrdersTotal(); i>=0; i++ )
     {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
          if (OrderSymbol() == _Symbol && OrderType() == OrType && OrderMagicNumber() == Magic)
             {
              count++;
             }
         }
     }return (count);
}

而如何指出这一点,没有人理解。
有谁能给个提示,让大家明白?

谢谢你的任何提示。

 
Alexander Avksentyev #:

下午好。

void OnTick()
  {
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment( 
  "\n",                      name,
  "\n", 
  "Символ ",                 Symbol(),  
  "\n",
  "Тайм Фрейм ",             Period(),
  "\n",                      AccountCompany(),
  "\n",
  " ",                       AccountServer(),
  "\n", 
  "Lots",                    Lot,
  "\n",
  "Объем в бай ",            "BuyLots()",
  "\n", 
  "Объем в сел ",            "SellLots()",
  "\n",
  "Price ",                  Bid,
  "\n", 
  "Дата ",                   TimeToString( TimeCurrent(), TIME_DATE ),
  "\n",
  "Server Time ",            TimeToString( TimeCurrent(), TIME_SECONDS ),
  "\n", 
  "\n", "Процент просадки ", NormalizeDouble(  (AccountInfoDouble(ACCOUNT_BALANCE)-AccountInfoDouble(ACCOUNT_MARGIN_FREE))/AccountInfoDouble(ACCOUNT_BALANCE)*100, 
  2)/*, "\n" //"  CalcTP() ", CalcTP(), "  t_p $ ", t_p, "  Profit() $ ", Profit(), "\n",  */); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   double body = Close[1] - Open[1];
   if (CountTrades() == 0 && body > 0) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0) SellOpen();    // Если нет открытых и сигнал селл
   if (CountTrades(0) > 0 && body > 0) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades(1) > 0 && body < 0) SellOpen();    // Если есть открытые селл и сигнал селл
  }  
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу                                 |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1) 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==MagicNum)
              {
               if(OrderType()==ot||ot==-1) cnt++;
              }
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
void BuyOpen() //Открытие позиции Buy
  {
   Forder = (OrderSend(_Symbol,OP_BUY,Lot,Ask,iSlippage,0,0,"Коммент",Magic,0,Blue));
   if(Forder > 0)
     {
      Print("Открыта Позиция BUY");
      if(OrderSelect(Forder, SELECT_BY_TICKET))
        {
         TP = NormalizeDouble((Ask+iTakeProfit*_Point),_Digits);
         if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
            Print("Ордер Модифицирован BUY "); 
         else 
            Print("Ошибка Модификации Ордера BUY = ",GetLastError());
        }
     }
   else Print("Ошибка Открытия Позиции BUY");
  }
//+------------------------------------------------------------------+
void SellOpen() //Открытие позиции Sell  
  {
   Forder = (OrderSend(_Symbol,OP_SELL,Lot,Bid,iSlippage,0,0,"Коммент Sell",Magic,0,Red));
   if (Forder > 0)
     {
      Print("Открыта Позиция SELL");
      if(OrderSelect(Forder, SELECT_BY_TICKET))
        {
         TP = NormalizeDouble((Bid-iTakeProfit*_Point),_Digits);
         if (OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0))
            Print("Ордер Модифицирован SELL "); 
         else 
            Print("Ошибка Модификации Ордера SELL = ",GetLastError());
        }
     }
   else Print("Ошибка Открытия Позиции SELL");
  }
//+------------------------------------------------------------------+
 
MakarFX #:

谢谢你。逻辑是正确的,只使计数器正确,并正确指定条件

if (CountTrades() == 0 && body > 0) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0) SellOpen();    // Если нет открытых и сигнал селл
   if (CountTrades(0) > 0 && body > 0) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades(1) > 0 && body < 0) SellOpen();    // Если есть открытые селл и сигнал селл

谢谢你。我会研究的。

 
Tretyakov Rostyslav #:

下午好。这里有一个问题。我有一个拖网。

void Trail()
{
 if(iTrailStart <= 0.0)return; 
 double tp,sl_lev;
 for(int i=OrdersTotal()-1; i>=0; i--)
    {
     if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
       {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
          {
           if(OrderType() == OP_BUY) 
             {
              if(iTrailTakeProfit > 0.0)
                {
                tp=OrderTakeProfit() + NormalizeDouble(iTrailTakeProfit * Point(),_Digits);
                if(NormalizeDouble(((tp - OrderTakeProfit())) < 0.0,Digits))return;
                tp = OrderTakeProfit();
                }else tp = 0.0;
              if(OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo(Symbol(), MODE_TICKVALUE) * iTrailStart * OrderLots())return;
                {
                 if(NormalizeDouble(Bid - OrderOpenPrice() <= iTrailStart * Point(),Digits))return;
                   {
                    if(OrderStopLoss()== 0.0 && NormalizeDouble((Bid-OrderStopLoss()) <= iTrailDist * Point(),_Digits))return;
                      {
                      if(iTrailStep > 0.0 && OrderStopLoss()==0.0 && NormalizeDouble((Bid - OrderStopLoss() - iTrailDist * Point() < iTrailStep * Point()),_Digits))return;
                        {
                         sl_lev = NormalizeDouble(Bid - iTrailDist * Point(),_Digits);
                         if(NormalizeDouble((Bid - sl_lev) < MarketInfo(Symbol(),MODE_STOPLEVEL) * Point,Digits))return;
                           {
                            if (!OrderModify(Forder,OrderOpenPrice(),OrderStopLoss() + iTrailStart * Point,OrderTakeProfit(),OrderExpiration()))
                            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
                           }
                        }
                      }
                   }
                }
             }
           if(OrderType() == OP_SELL)
             {
              if(iTrailTakeProfit > 0.0)
                {
                 tp=OrderProfit() - NormalizeDouble(iTrailTakeProfit * Point(),_Digits);
                 if(NormalizeDouble((OrderTakeProfit() - tp) < 0.0,_Digits))return;
                 tp = OrderTakeProfit();
                }else tp = 0.0;
              if(OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo(Symbol(), MODE_TICKVALUE) * iTrailStart * OrderLots())return;
                {
                 if(NormalizeDouble((OrderProfit() - Ask) <= iTrailStart * Point(),_Digits))return;
                   {
                    if(OrderStopLoss() == 0.0 && NormalizeDouble((OrderStopLoss() - Ask) <= iTrailDist * Point(),_Digits))return;
                      {
                       if(iTrailStep > 0.0 && OrderStopLoss() == 0.0 && NormalizeDouble((OrderStopLoss() - Ask) - iTrailDist * Point(),_Digits) < iTrailStep * Point())return;
                         {
                          sl_lev = NormalizeDouble(Ask + iTrailDist * Point(),_Digits);
                          if(NormalizeDouble((sl_lev - Ask) > MarketInfo(Symbol(),MODE_STOPLEVEL) * Point,_Digits)) return;
                            {
                            if (!OrderModify(Forder,OrderOpenPrice(),OrderStopLoss() + iTrailStart * Point,OrderTakeProfit(),OrderExpiration()))
                            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}}}}}}}}}}

我如何对我的专家顾问进行指定以使其发挥作用?

void OnTick()
  {
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment( 
  "\n",                      name,
  "\n", 
  " ",                       Symbol(),  
  "\n",
  "Тайм Фрейм ",             Period(),
  "\n",                      AccountCompany(),
  "\n",
  "\n ",                     AccountServer(),
  "\n", 
  "Lots\n",                  B_S_Lot(),
  "\n",
  "Price ",                  Bid,
  "\n", 
  "Дата ",                   TimeToString( TimeCurrent(), TIME_DATE ),
  "\n",
  "Server Time ",            TimeToString( TimeCurrent(), TIME_SECONDS ),
  "\n", 
  "Profit ",                 Profit(),
  "\n",
  "AvTP ",                   CalcTP (),
  "\n", 
  "Количество ордеров ",     CountTrades(),
  "\n",
  "\n ",                     GetVolumeLotLastOrder(),
  "\n",
  "\n", "Процент просадки ", NormalizeDouble(  (AccountInfoDouble(ACCOUNT_BALANCE)-AccountInfoDouble(ACCOUNT_MARGIN_FREE))/AccountInfoDouble(ACCOUNT_BALANCE)*100,2)
  ); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   double body = Close[1] - Open[1];
   if (CountTrades() == 0 && body > 0) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0) SellOpen();    // Если нет открытых и сигнал селл
   if (CountTrades(0) > 0 && body > 0) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades(1) > 0 && body < 0) SellOpen();    // Если есть открытые селл и сигнал селл
   Trail();
  }

我看到他们是这样规定的,但对我来说,不知何故,这并不奏效。

这是一个一般的问题,要指定函数工作的前,我应该怎么做?

原因: