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

 
alexey1979621:

Lisez le tutoriel sur ce truc.

string DoubleToStr( double valeur, int chiffres)
Convertit une valeur numérique en une chaîne de texte contenant la représentation en caractères d'un nombre dans un format de précision spécifié.
Paramètres :
valeur - Valeur à virgule flottante.
chiffres - Un format de précision, le nombre de chiffres après le point décimal (0-8).
Exemple :


Cependant, je n'ai toujours pas trouvé où l'attacher dans notre cas. Sauvez encore le chef.

Il n'y a rien à quoi l'attacher.

C'est ici qu'il peut être fixé :

Print("А ведь цена-то Ask ("+DoubleToStr(Ask,Digits)+") у меня однако с точностью Digits");
C'est pour la sortie en format chaîne de caractères, pas pour le calcul.
 
artmedia70:

Il n'y a rien à quoi l'attacher.

Vous pouvez le faire ici :

C'est pour la sortie en format chaîne de caractères, pas pour le calcul.
Il a fait un mouvement intelligent de int init() supprimé l'enfer hors de lui. Le texte de l'EA est maintenant normalisé. Tout fonctionne bien maintenant. artmedia70 merci.
 
Le conseiller expert place les ordres en attente à une distance donnée du prix actuel, puis les modifie après un temps donné. Tout se passe bien, mais parfois le terminal ne permet pas la modification. Ensuite, l'ordre non modifié doit être supprimé. Comment faire ?
 
artmedia70:

Messieurs ! !! Qu'est-ce qui vous trouble ?

iFractals() renvoie le prix, et non le numéro de barre de la fractale.


Oui, parfois ce n'est pas vendredi))))
 
Bonjour, je demande de l'aide, j'ai une tâche: Déterminer l'efficacité de l'utilisation de l'indicateur technique Commodity Channel Index sur les données statistiques de la période D 1 d'une action ordinaire d'OJSC Rosneft, je ne peux pas formuler comment écrire cet indicateur correctement pour ouvrir et fermer une position longue et courte, je semble faire mais le conseiller refuse de compiler, donne une erreur . Aidez-moi, cet indicateur doit être appliqué dans cette liste, je la présente sans mes x modifications.
 #property copyright "Copyright © 2010, E-Commerce"
#property link        "http://e-commerce.psati.ru"
 
extern double StopLoss= 3000   ;           // SL для открываемого ордера
extern double TakeProfit= 3000 ;           // ТР для открываемого ордера
extern int TrailingStop= 100 ; 
extern double Lots      = 0.1 ;           // Жестко заданное колич. лотов
double Prots     = 0.07 ;         // Процент свободных средств
extern int SignalLine  = 5 ;           // Период расчётной МА
extern int SignalLine1  = 10 ;           // Период расчётной МА
extern int N1 = 5 ;  
extern int N2  = 10 ; 
int Bars_V       = 34 ;           // Колич.баров для расчёта скор
int Aver_Bars    = 0 ;             // Колич. баров для сглаживания
double Level     = 0.001 ;

bool    Work= true ;                       // Эксперт будет работать.
string Symb;                           // Название финанс. инструмента

int start()
  {
   int
   Period_MA=SignalLine1,
   Period_MA_1=SignalLine,
   Total,                               // Количество ордеров в окне 
   Tip=- 1 ,
   coef,                             // Тип выбран. ордера (B=0,S=1)
   Ticket;                             // Номер ордера
   double
   MA_1_t,                             // Значен. МА_1 текущее
   MA_2_t,                             // Значен. МА_2 текущее 
   Lot,                                 // Колич. лотов в выбран.ордере
   Lts,                                 // Колич. лотов в открыв.ордере
   Min_Lot,                             // Минимальное количество лотов
   Step,                               // Шаг изменения размера лота
   Free,                               // Текущие свободные средства
   One_Lot,                             // Стоимость одного лота
   Price,                               // Цена выбранного ордера
   SL,                                 // SL выбранного ордера 
   TP;                               // TP выбранного ордера
   bool
   Ans  = false ,                         // Ответ сервера после закрытия
   Cls_B= false ,                         // Критерий для закрытия  Buy
   Cls_S= false ,                         // Критерий для закрытия  Sell
   Opn_B= false ,                         // Критерий для открытия  Buy
   Opn_S= false ;                         // Критерий для открытия  Sell
   int BBars= 10000000 ;
   if ( Bars < Period_MA_1)                       // Недостаточно баров
     {
       Alert ( "Недостаточно баров в окне. Эксперт не работает." );
       return ;                                   // Выход из start()
     }
   if (Work== false )                               // Критическая ошибка
     {
       Alert ( "Критическая ошибка. Эксперт не работает." );
       return ;                                   // Выход из start()
     }
     
   // Учёт ордеров
   Symb= Symbol ();                               // Название фин.инстр.
   Total= 0 ;                                     // Количество ордеров
   for ( int i= 1 ; i<= OrdersTotal (); i++)           // Цикл перебора ордер
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true ) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb) continue ;       // Не наш фин. инструм
         if (OrderType()> 1 )                     // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total> 1 )                           // Не более одного орд
           {
             Alert ( "Несколько рыночных ордеров. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Ticket=OrderTicket();                   // Номер выбранн. орд.
         Tip   =OrderType();                     // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                 // SL выбранного орд.
         TP    =OrderTakeProfit();               // TP выбранного орд.
         Lot   =OrderLots();                     // Количество лотов
        }
     }

   // Торговые критерии
   int P= Period_MA_1;             // Период расчётной МА
   int B= Bars_V;                 // Колич.баров для расчёта скорост
   int A= Aver_Bars;               // Колич. баров для сглаживания
   int Z= Period_MA;
   //double L_1=iCustom(NULL,0,"IPM",H,P,B,A,0,0);
   //double L_5=iCustom(NULL,0,"IPM",H,P,B,A,1,0);
   double Ma2_Previus,Ma3_Previus, Ma2_Current, Ma3_CurrentPrice, CurrentLine, PreviousLine, Line15,Current, Line30;
   //Ma3_Previus=iCustom(NULL,0,"444",H,P,B,A,1,1);
   //Ma2_Previus=iCustom(NULL,0,"www",P,Z,N1,N2,0,2);
  
   //Ma3_Current=iCustom(NULL,0,"444",H,P,B,A,1,2);
   // Ma2_Current=iCustom(NULL,0,"www",P,Z,N1,N2,0,1);

//ПАРАМЕТРЫ ОТКРЫТИЯ ДЛИННОЙ ПОЗИЦИИ

if ( iCCI ( Symbol (), 0 , 12 , PRICE_TYPICAL , 0 )>= 100 )
{
if ((NumberOfBarOpenLastPos()> 0 ||NumberOfBarOpenLastPos()==- 1 )&&(NumberOfBarCloseLastPos()> 0 ||NumberOfBarCloseLastPos()==- 1 ))
{ 
Opn_B= true ;
//Cls_S=true;
}
}
 //ПАРАМЕТРЫ ОТКРЫТИЯ короткой ПОЗИЦИИ    
if ( iCCI ( Symbol (), 0 , 20 , PRICE_TYPICAL , 0 )<= 100 )
{
if ((NumberOfBarOpenLastPos()> 0 ||NumberOfBarOpenLastPos()==- 1 )&&(NumberOfBarCloseLastPos()> 0 ||NumberOfBarCloseLastPos()==- 1 ))
{
Opn_S= true ; 
//Cls_B=true;   
}  
}


if (Tip== 0 ){
           if (TrailingStop> 0 )  
              {                 
               if (Bid-OrderOpenPrice()> Point *TrailingStop)
                 {
                   if (SL<Bid- Point *TrailingStop)
                    {
                     OrderModify(Ticket,OrderOpenPrice(),Bid- Point *TrailingStop,TP, 0 ,Green);
                     //return(0);
                    }
                 }
              }
}

if (Tip== 1 ){
           if (TrailingStop> 0 )  
              {                 
               if ((OrderOpenPrice()-Ask)>( Point *TrailingStop))
                 {
                   if (SL>Ask+ Point *TrailingStop)
                    {
                     OrderModify(Ticket,OrderOpenPrice(),Ask+ Point *TrailingStop,TP, 0 ,Red);
                     // return(0);
                    }
                 }
              }
}


   // Закрытие ордеров
   while ( true )                                   // Цикл закрытия орд.
     {
//длинной
if ( iCCI ( Symbol (), 0 , 12 , PRICE_TYPICAL , 0 )<= 100 ){
       if (Tip== 0 )                 // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert ( "Попытка закрыть Buy " ,Ticket, ". Ожидание ответа.." );
         RefreshRates();                         // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid, 2 );       // Закрытие Buy
         if (Ans== true )                         // Получилось :)
           {
             Alert ( "Закрыт ордер Buy " ,Ticket);
             break ;                               // Выход из цикла закр
           }
                           
            
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
        }

// короткой       
//if (Close[i]<0)
if ( iCCI ( Symbol (), 0 , 20 , PRICE_TYPICAL , 0 )>= 100 ){
       if (Tip== 1 )                 // Открыт ордер Sell..
        {                                       // и есть критерий закр
         Alert ( "Попытка закрыть Sell " ,Ticket, ". Ожидание ответа.." );
         RefreshRates();                         // Обновление данных
         Ans=OrderClose(Ticket,Lot,Ask, 2 );       // Закрытие Sell
         if (Ans== true )                         // Получилось :)
           {
             Alert ( "Закрыт ордер Sell " ,Ticket);
             break ;                               // Выход из цикла закр
           }
                  
           
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
        }
       break ;                                     // Выход из while
     }



// Стоимость ордеров
   RefreshRates();                               // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);         // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED); // Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0 )                                 // Если заданы лоты,то 
      Lts =Lots;                                 // с ними и работаем 
   else                                          // % свободных средств
      Lts= MathFloor (Free*Prots/One_Lot/Step)*Step; // Для открытия
 
   if (Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                       // Лот дороже свободн.
     {
       Alert ( " Не хватает денег на " , Lts, " лотов" );
       return ;                                   // Выход из start()
     }
   // Открытие ордеров
   while ( true )                                   // Цикл закрытия орд.
     {
       if (Total== 0 && Opn_B== true )               // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();          
         SL=Bid - New_Stop(StopLoss)* Point ;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_BUY,Lts,Ask, 2 ,SL,TP); //Открытие Buy

         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       if (Total== 0 && Opn_S== true )               // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();        
         SL=Ask + New_Stop(StopLoss)* Point ;     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit)* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Sell. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_SELL,Lts,Bid, 2 ,SL,TP); //Открытие Sel
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Sell " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       break ;                                     // Выход из while
     }
   return ;                                       // Выход из start()
  }
int Fun_Error( int Error)                         // Ф-ия обработ ошибок
  {
   switch (Error)
     {                                           // Преодолимые ошибки            
       case    4 : Alert ( "Торговый сервер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 135 : Alert ( "Цена изменилась. Пробуем ещё раз.." );
         RefreshRates();                         // Обновим данные
         return ( 1 );                             // Выход из функции
       case 136 : Alert ( "Нет цен. Ждём новый тик.." );
         while (RefreshRates()== false )           // До нового тика
             Sleep ( 1 );                           // Задержка в цикле
         return ( 1 );                             // Выход из функции
       case 137 : Alert ( "Брокер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 146 : Alert ( "Подсистема торговли занята. Пробуем ещё.." );
         Sleep ( 500 );                             // Простое решение
         return ( 1 );                             // Выход из функции
         // Критические ошибки
       case    2 : Alert ( "Общая ошибка." );
         return ( 0 );                             // Выход из функции
       case    5 : Alert ( "Старая версия терминала." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 64 : Alert ( "Счет заблокирован." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 133 : Alert ( "Торговля запрещена." );
         return ( 0 );                             // Выход из функции
       case 134 : Alert ( "Недостаточно денег для совершения операции." );
         return ( 0 );                             // Выход из функции
       default : Alert ( "Возникла ошибка " ,Error); // Другие варианты   
         return ( 0 );                             // Выход из функции
     }
  }
int New_Stop( int Parametr)                       // Проверка стоп-прик.
  {
   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL); // Миним. дистанция
   if (Parametr<Min_Dist)                       // Если меньше допуст.
     {
      Parametr=Min_Dist;                         // Установим допуст.
       Alert ( "Увеличена дистанция стоп-приказа." );
     }
   return (Parametr);                             // Возврат значения
  }
 
 int NumberOfBarOpenLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
   datetime t;
   int i, k= OrdersTotal ();

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
   if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
   if (OrderSymbol()==sy) {
   if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
   if (op< 0 || OrderType()==op) {
   if (mn< 0 || OrderMagicNumber()==mn) {
   if (t<OrderOpenTime()) t=OrderOpenTime();
  }
  }
  }
  }
  }
  }
   return (iBarShift(sy, tf, t, True));
}
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
   datetime t;
   int       i, k=OrdersHistoryTotal();

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
       if (OrderSymbol()==sy) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==op) {
             if (mn< 0 || OrderMagicNumber()==mn) {
               if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
   return (iBarShift(sy, tf, t, True));
}
 
niformalka:
Bonjour, je demande de l'aide, j'ai une tâche : Déterminer l'efficacité de l'indicateur technique Commodity Channel Index sur le calendrier des données statistiques D1 actions ordinaires de JSC "Rosneft", je ne peux pas formuler comment écrire correctement cet indicateur pour ouvrir et fermer une position longue et courte, je pense que je fais, mais le conseil refuse de compiler, donne une erreur. Je pense avoir besoin d'aide ici, je dois appliquer cet indicateur à cette liste mais je ne l'ai pas modifié.
Donc, il s'agit de votre conseiller, pas de l'indicateur ... La compilation sans erreurs est en cours....Maintenant, je vais jouer avec votre code..... hypothétique....
 
Sepulca:
Il s'agit donc d'un EA, et non d'un indicateur....La compilation se déroule sans erreur....Je vais jouer avec votre code..... hypotest....


Je dois appliquer exactement l'indicateur dont j'ai besoin dans mon EA, à savoir icc, il compile le code source
 
alsu:

Oui, parfois ce n'est pas vendredi))))

Qu'est-ce qu'il y a de mal à ça ?

//+------------------------------------------------------------------+
//|                                                  TestFractal.mq4 |
//|                               Copyright 2013, Artyom A. Trishkin |
//|                       https://www.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Artyom A. Trishkin"
#property link      "https://www.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property  strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int i=3; i<300; i++) {
      double fu=iFractals(Symbol(),Period(),MODE_UPPER,i);
      double fd=iFractals(Symbol(),Period(),MODE_LOWER,i);
      if(fu>0) Print("Значение UP на баре "+(string)i+" = "+DoubleToStr(fu,Digits));
      if(fd>0) Print("Значение DN на баре "+(string)i+" = "+DoubleToStr(fd,Digits));
      }
  }
//+------------------------------------------------------------------+

Le prix revient...

 

Commençons par le principal : il n'est pas vraiment judicieux de passer des commandes à partir de zéro. Il vaut mieux commencer par le dernier.

for(int i=OrderTotal-1; i>=0; i--)          // Цикл перебора ордер
Nous ne voulons pas nous retrouver dans une situation où nous avons fermé/supprimé l'ordre zéro et qu'il y a d'autres ordres sur celui-ci. Si vous utilisez la dernière commande sur le compte, rien de grave ne se produit.
 
Sepulca:

Начнем с главного, не совсем грамотно перебирать ордера с нулевого. Лучше с последнего

Чтобы не возникало ситуации, когда нулевой по счету закрыли/удалили а там ещё ордера есть. всё переколбасилось. Когда действуете с последним по счёту ничего страшного не происходит.


le professeur prouve que rien ne doit être changé dans le code, sauf pour les lignes avec l'ouverture et la fermeture des positions courtes et longues, j'ai fait quelque chose comme ça mais ça ne compile pas
if ((iCCI(Symbol,0,14,PRICE_TYPICAL,0)<100)&&(iCCI(Symbol,0,14,PRICE_TYPICAL,0)<-100)) 

Raison: