Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1811

 
MakarFX #:

Les bibliothèques fonctionnent-elles ?

J'ai vu une vidéo quelque part sur le net sur la façon de démonter cette chose, mais il faut ouvrir quelque chose lors de la création, que ce soit les en-têtes ou autre chose. J'ai recompilé le code sur 64KA et ça a marché. Eh bien, il s'avère que sur 64ka le pointeur de 8 octets est déjà vu pas trop mal et il peut y avoir d'autres différences critiques qu'il faut fortement jouer avec cette question. Je voudrais simplement travailler avec le compilateur 32 bits pour le débogage et j'ai quelques idées spécialisées pour eux.

 
Pouvez-vous me dire pourquoi le double 0.00134 n'est pas divisible par 30 ?
il donne un nombre entier et un nombre infini après la virgule
Il devrait être environ 0.00004
 
Ivan Butko #:
Pouvez-vous me dire pourquoi le double 0.00134 n'est pas divisible par 30 ?
il donne un nombre entier et un nombre infini après la virgule
Il devrait être environ 0.00004
Print( DoubleToString(0.00134/30) ); 0.00004467

 
Vitaly Muzichenko #:

Vitaly, si vous ne l'imprimez pas, est-ce que les calculs internes montreront 0.00004.... ou 5.666666.....e ?
Ou est-ce la même chose ?
 
Ivan Butko #:
Vitaly, si vous ne l'imprimez pas, les calculs internes indiqueront 0.00004..... ou 5.666666.....e ?
Ou est-ce la même chose ?

les calculs internes n'incluent que ceci (un entier hexadécimal de huit octets)

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

0.00004467 = 0x3f076b81834d51ed
 
bonjour ! quelqu'un connaît-il un duplicateur judicieux des transactions de MT4 vers le Quick exchange ?
 

Bon après-midi. Aide


J'ai un code sans vérifier la présence d'ordres ouverts.

Ouvre les ordres selon la logique établie, mais ouvre aussi bien les ordres d'achat que de vente.

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

Nous allons travailler avec ces ordres.

//Il n'est pas nécessaire de vérifier l'ordre s'il est ouvert.


Si vous activez la vérification, les commandes ne sont pas ouvertes comme nous le souhaiterions.
Si nous voulons éviter les contre-ordres, nous devons vérifier le premier ordre à ouvrir et ensuite ouvrir le même type jusqu'à ce que le dernier type d'ordre soit fermé, puis revenir à la logique de vérification des conditions d'ouverture.

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

Et on ne sait pas comment le montrer.
Y a-t-il quelqu'un qui puisse donner un coup de pouce pour comprendre ?

Merci pour tout conseil.

 
Alexander Avksentyev #:

Bon après-midi.

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

Merci. La logique était correcte, rendez le compteur uniquement correct et spécifiez la condition correctement

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

Merci. Je vais m'en occuper.

 
Tretyakov Rostyslav #:

Bon après-midi. Voici une question. J'ai un chalut.

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

Comment dois-je spécifier à mon conseiller expert pour qu'il fonctionne ?

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

J'ai vu qu'ils le spécifient de cette façon, mais cela ne fonctionne pas pour moi.

C'est un problème général de spécifier l'ex pour que la fonction fonctionne, comment dois-je faire ?