Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1810

 
Você pode me dizer por que o dobro 0,00134 não é divisível por 30?
ele dá um inteiro e um número infinito após o ponto decimal
ele deve ser cerca de 0,00004
 
Ivan Butko #:
Você pode me dizer por que o dobro 0,00134 não é divisível por 30?
ele dá um inteiro e um número infinito após o ponto decimal
ele deve ser cerca de 0,00004
Print( DoubleToString(0.00134/30) ); 0.00004467

 
Vitaly Muzichenko #:

Vitaly, se você não imprimir, os cálculos internos mostrarão 0.00004.... ou 5.666666.....e ?
Ou é a mesma coisa?
 
Ivan Butko #:
Vitaly, se você não imprimir, os cálculos internos mostrarão 0.00004.... ou 5.666666.....e ?
Ou é a mesma coisa?

os cálculos internos incluem apenas isso (um inteiro inteiro hexadecimal de oito bytes)

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

0.00004467 = 0x3f076b81834d51ed
 
olá! alguém conhece um duplicador sensato de negócios da MT4 para a troca rápida?
 

Boa tarde. Ajuda


Tenho um código sem verificar a presença de pedidos em aberto.

Abre ordens de acordo com a lógica estabelecida, mas abre tanto ordens de compra como de venda

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//
/*}*/

Vamos trabalhar com estas ordens.

// Não é necessário verificar o pedido se ele estiver aberto.


Se você permitir a verificação, então as ordens não são abertas como gostaríamos que fossem.
Se quisermos evitar contra-ordens, devemos verificar a primeira ordem a ser aberta e depois abrir o mesmo tipo até o último tipo de ordem ser fechado e depois voltar à lógica de verificar as condições de abertura.

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);
}

E como apontar para isso não há compreensão.
Alguém lá fora que possa dar um empurrão para entender?

Obrigado por qualquer dica.

 
Alexander Avksentyev #:

Boa tarde.

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 #:

Obrigado. A lógica estava correta, tornar o contador apenas correto e especificar a condição corretamente

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();    // Если есть открытые селл и сигнал селл

Obrigado. Vou investigar isso.

 
Tretyakov Rostyslav #:

Boa tarde. Aqui vai uma pergunta. Eu tenho uma rede de arrasto.

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());
}}}}}}}}}}

Como posso especificar ao meu consultor especializado para que funcione?

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();
  }

Vi que eles especificam dessa forma, mas de alguma forma não funciona para mim.

É um problema geral especificar o ex para que a função funcione, como devo fazer isso?

 
Alexander Avksentyev #:

Boa tarde. Aqui vai uma pergunta. Eu tenho uma rede de arrasto.

Como posso especificar ao meu consultor especializado para que funcione?

Vi que eles especificam dessa forma, mas de alguma forma não funciona para mim.

Em geral, o problema é especificar o ex, para que a função funcione, como fazer isso?

O que é isso!!!

if(NormalizeDouble(((tp - OrderTakeProfit())) < 0.0,Digits))
if(NormalizeDouble(Bid - OrderOpenPrice() <= iTrailStart * Point(),Digits))
if(NormalizeDouble((Bid - sl_lev) <  MarketInfo(Symbol(),MODE_STOPLEVEL) * Point,Digits))

NormalizeDupla leitura e me diga como você coloca a comparação lá.


P.S. Você não tem nenhum erro em seu diário de bordo?

Razão: