Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 486

 
evillive:

Si vous prenez votre nombre 108, vous obtiendrez au maximum 151 à la puissance 151 - 108^151=1.11426138071861e+307

108^152=1.20340229117609e+309 est trop pour une programmation MCL, sans parler de 108^4096

Quel genre de calculs nécessiterait une telle échelle ?


J'essaie de synthétiser l'analyse des mouvements de prix et la gestion de l'attention par la PNL, et le cerveau en pilotage automatique :)
 
alex12:
J'essaie de synthétiser l'analyse des mouvements de prix et la gestion de l'attention par la PNL, et mon cerveau est en pilotage automatique :)
Dans la quête de l'illumination, l'essentiel est de choisir les bonnes substances pour ne pas voler trop loin...
 

J'ai commencé à apprendre MQL4 et je n'arrive pas à comprendre comment une commande est sélectionnée.

du tutoriel :

for(int i=1 ; i<=OrdersTotal() ; i++) // La boucle de commande

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Si

{

si (OrderSymbol()!= Symb) continuer ;

Ce que je comprends, c'est que pour i=1 tant que i<= Nombre d'ordres

Si l'ordre sélectionné en position i-1 (c'est-à-dire l'ordre #0) existe

Comparez-le au symbole

Puis ajouter 1(i++) à i et commencer une nouvelle itération

Je ne comprends pas le commentaire // S'il y a un ordre suivant (que voulez-vous dire : suivant par position ou cet ordre qui est actuellement sélectionné ?)

Veuillez expliquer en russe.

 
S'il y a un ordre, c'est-à-dire qu'il existe sous le numéro et-1, alors passez à la condition suivante.
 
Vladon:
S'il y a un ordre, c'est-à-dire qu'il existe sous le numéro et-1, alors passez à la condition suivante.

Il trouvera toujours un ordre avec le numéro zéro (qui est i-1). Quelle méthode insensée pour déterminer la "prochaine" commande, vraiment trompeuse...
 
Merci pour ces explications.
 
evillive:

Il trouvera toujours un ordre avec un numéro zéro (qui est i-1). Il s'agit d'une méthode sauvage pour déterminer la "prochaine" commande, qui est vraiment trompeuse...


S'il n'y a pas de commandes, alors avec ce modèle :

for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;

il ne passera pas à la condition suivante.

car il n'y a pas d'ordre et-1 (dans notre cas =0)

Bien sûr, il n'est pas pratique de l'écrire de cette façon et on ne sait pas pourquoi il devrait en être ainsi,

et non, par exemple, de cette manière :

for(int i=0; i<OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;
 

Bonjour Mr. les programmeurs, j'ai une question, je ne peux pas apprendre une partie du code pour fermer le pourcentage du solde du compte. il ne ferme pas le pourcentage mais tout à la fois et tous les ordres qui sont dans le marché. j'ai besoin que ce serait fermer un ordre spécifique et le pourcentage calculé du solde du dépôt.conseiller ce que je fais mal ?


extern double Percent = 2.0 ;
extern int Slippage = 2 ;
double stop ;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10 ;
}

for(int i = OrdersTotal()-1 ; i>=0 ; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol())
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent ;
if(stop<=AccountBalance())
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua) ;
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua) ;
}//if(ostop<=AccountBalance())
}////(ostop==AccountBalance()/100*Percent)
}//// (OrderSymbol() == Symbol() )
}// (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//// for(int i = OrdersTotal()-1 ; i>=0 ; i--)
return ;
}////void OnStart()
//+-----------------------------------------------------------------

 
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);

Comment ça ?

et ceci :

if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;

ne seront jamais remplies.

donc :

if(stop<=AccountBalance())

travaillera toujours avec chaque commande.

CONCLUSION : tout est faux.

Votre fonction doit être réfléchie, je n'ai pas de réponse rapide.

mais au moins c'est comme ça pour commencer :

extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol()) 
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(OrderProfit()>=AccountBalance()/100*Percent)

{
if(OrderType() == OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
if(OrderType() == OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}//if(ostop==AccountBalance()/100*Percent)
}//if (OrderSymbol() == Symbol() )
}//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//for(int i = OrdersTotal()-1; i>=0; i--)
return;
}//void OnStart()
//+-----------------------------------------------------------------
 
Vladon:


S'il n'y a pas d'ordres dans une telle construction :

il ne passera pas à la condition suivante.

car il n'y a pas d'ordre et-1 (dans notre cas =0)

Bien sûr, il n'est pas pratique de l'écrire de cette façon et on ne sait pas pourquoi il devrait en être ainsi,

et non, par exemple, comme ceci :


En le lisant, j'ai aussi pensé pourquoi ne pas simplement mettre i=0, cela semble plus simple et plus clair.

Voici le code complet du script, il y a peut-être une bonne raison pour laquelle l'auteur a mis i=1 au lieu de i=0. Je ne m'y connais pas assez et il se peut tout simplement que je ne le voie pas, alors que j'ai besoin de comprendre le mécanisme de fonctionnement pour ne pas soulever de questions plus tard

// closeorder.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   int Real_Order=-1;                           // Пока рыночных нет
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         int Tip=OrderType();                   // Тип ордера
         if (Tip>1) continue;                   // Отложенный ордер  
         //------------------------------------------------------ 4 --
         double Price=OrderOpenPrice();         // Цена ордера
         if (NormalizeDouble(MathAbs(Price-Win_Price),Digits)< //Выбор
            NormalizeDouble(Dist,Digits))       // самого близкого орд       
           {
            Dist=MathAbs(Price-Win_Price);      // Новое значение
            Real_Order=Tip;                     // Есть рыночный ордер
            int Ticket=OrderTicket();           // Номер ордера
            double Lot=OrderLots();             // Количество лотов
           }
         //------------------------------------------------------ 5 --
        }                                       //Конец анализа ордера
     }                                          //Конец перебора орд.
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
      if (Real_Order==-1)                       // Если рыночных нет
        {
         Alert("По ",Symb," рыночных ордеров нет");
         break;                                 // Выход из цикла закр        
        }
      //--------------------------------------------------------- 7 --
      switch(Real_Order)                        // По типу ордера
        {
         case 0: double Price_Cls=Bid;          // Ордер Buy
            string Text="Buy ";                 // Текст для Buy
            break;                              // Из switch
         case 1: Price_Cls=Ask;                 // Ордер Sell
            Text="Sell ";                       // Текст для Sell
        }
      Alert("Попытка закрыть ",Text," ",Ticket,". Ожидание ответа..");
      bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрытие ордера
      //--------------------------------------------------------- 8 --
      if (Ans==true)                            // Получилось :)
        {
         Alert ("Закрыт ордер ",Text," ",Ticket);
         break;                                 // Выход из цикла закр
        }
      //--------------------------------------------------------- 9 --
      int Error=GetLastError();                 // Не получилось :(
      switch(Error)                             // Преодолимые ошибки
        {
         case 135:Alert("Цена изменилась. Пробуем ещё раз..");
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
         case 136:Alert("Нет цен. Ждём новый тик..");
            while(RefreshRates()==false)        // До нового тика
               Sleep(1);                        // Задержка в цикле
            continue;                           // На след. итерацию
         case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
            Sleep(500);                         // Простое решение
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
        }
      switch(Error)                             // Критические ошибки
        {
         case 2 : Alert("Общая ошибка.");
            break;                              // Выход из switch
         case 5 : Alert("Старая версия клиентского терминала.");
            break;                              // Выход из switch
         case 64: Alert("Счет заблокирован.");
            break;                              // Выход из switch
         case 133:Alert("Торговля запрещена");
            break;                              // Выход из switch
         default: Alert("Возникла ошибка ",Error);//Другие варианты   
        }
      break;                                    // Выход из цикла закр
     }
//-------------------------------------------------------------- 10 --
   Alert ("Скрипт закончил работу -----------------------------");
   return;                                      // Выход из start()
  }