[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 627

 
rigonich:
Vous faites d'abord sl = 0 ; tp = 0 ; et ensuite if(sl != 0 || tp != 0).


Vitaly, le point est clair là. Regardez :

void OrdersModifying(double& sl, double& tp)
{
  int total = OrdersTotal() - 1;
  sl = 0; tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

Au début, sl = 0; tp = 0; Puis je trouve les valeurs normalisées de sl et tp qui seront déjà dans l'ordre en fonction de i_sl et i_tp saisis par l'utilisateur. Et ensuite je vérifie sisl ettp ne sont pas égaux à zéro, c'est-à-dire s'ils ont changé après que je les ai déclarés au début de la fonction, alors nous modifions l'ordre.

Et sisl ettp sont égaux à zéro, cela signifie que ces paramètres n'ont pas été calculés... comme je le comprends. Une fois que j'aurai obtenu les valeurs de ces variables, elles deviendront immédiatement non nulles, et nous pourrons modifier l'ordre... Est-ce que ça a du sens ?

 
hoz:


Vitaly, le point est clair là. Voir :

Au début sl = 0; tp = 0; Ensuite, sur la base des i_sl et i_tp saisis par l'utilisateur, je trouve les valeurs normalisées de sl et tp qui seront déjà dans l'ordre. Et ensuite je vérifie sisl ettp ne sont pas égaux à zéro, c'est-à-dire s'ils ont changé après que je les ai déclarés au début de la fonction, alors nous modifions l'ordre.

Et sisl ettp sont égaux à zéro, cela signifie que ces paramètres n'ont pas été calculés... comme je le comprends. Une fois que j'aurai obtenu les valeurs de ces variables, elles deviendront immédiatement non nulles, et nous pourrons modifier l'ordre... Est-ce que ça a du sens ?



Désolé, je n'ai pas vu quelque chose, pas de lunettes et pas de couleur, mais pourquoi passer des paramètres à cette fonction, et par référence en plus ? Si i_sl, g_type... sont des variables globales, il fonctionnera sans paramètres, et si vous devez les changer (variables après modification), faites-le dans la même fonction après modification.
 
rigonich:

Désolé, je n'ai pas vu quelque chose, je ne porte pas de lunettes ou de couleur, mais pourquoi devrions-nous passer des paramètres dans cette fonction, et par référence, aussi ? Si i_sl, g_type... sont des variables globales, il fonctionnera sans paramètres, et si vous devez les modifier (variables après modification), faites-le dans la même fonction après modification.


Les ordres sont envoyés par les fonctionsOpenBuy() etOpenSell(), mais la fonctionOrdersModifying()modifie les ordres

C'est-à-dire que si, par exemple, la fonction de modification est placée dans la fonctionTrade (int signal) ouOpenBuy() etOpenSell(), alors les valeurs sl et tp obtenues dans la fonctionOrdersModifying() doivent être passées là de toute façon.Ces valeurs sont manquantes dans cette fonction.

 
hoz:


Les ordres sont envoyés par les fonctionsOpenBuy() etOpenSell(), mais ils sont modifiés par la fonctionOrdersModifying().

C'est-à-dire que si, par exemple, la fonction de modification est placée dans la fonctionTrade (int signal) ouOpenBuy() etOpenSell(), alors les valeurs sl et tp obtenues dans la fonctionOrdersModifying() doivent être passées là de toute façon.Ces valeurs sont manquantes dans cette fonction.


Dans votre cas, les fonctionsOpenBuy() etOpenSell() placent des ordres sans std et ensuite, si les ordres sont placés, ils sont modifiés à l'aide de la fonctionOrdersModifying() . Je ne vois pas la nécessité de placer ailleurs la fonctionOrdersModifying() et de lui passer des paramètres. Ilsuffit de déclarer lesvariables sl et tp dans cette fonction. int sl = 0, tp = 0 ;

Désolé, pas int, un double.

 
rigonich:

Vos fonctionsOpenBuy() etOpenSell() placent des ordres sans sl et ainsi de suite, puis, si les ordres sont placés, ils sont modifiés à l'aide de la fonctionOrdersModifying() . Je ne vois pas la nécessité de placer ailleurs la fonctionOrdersModifying() et de lui passer des paramètres. Ilsuffit de déclarer lesvariables sl et tp dans cette fonction. int sl = 0, tp = 0 ;


En ce moment, je dispose d'une telle fonction commerciale :

bool Trade (int signal)
{
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу
  
  if(OrderStopLoss() == 0 && OrderTakeProfit() == 0)
    OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    
  if(UseBU == true)
     MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

La modification n'a pas lieu.

 
hoz:


En ce moment, je dispose d'une telle fonction commerciale :

La modification n'a pas lieu.


Vous avez un ordre non sélectionné dans la fonction Trade ().
 
rigonich:

Je ne comprends pas ce que vous attendez du script.


Vous avez besoin d'un programme, qui, lorsqu'il est lancé dans l'archive des cartes

Les sections de mouvement de prix seront marquées visuellement avec les paramètres spécifiés en termes de force et de temps du mouvement.

Par exemple - une correction de 400 points effectuée en 30 minutes. Et donc pour toute l'année, toutes les corrections dans cette fourchette.

Il est impossible de les observer visuellement à la main. Distorsions. J'aimerais disposer d'un code de couleurs qui permettrait de les voir immédiatement.

___

J'ai regardé, il y a différents programmes "Histoty". Mais ils ne visualisent que l'historique du compte.

Mais je n'ai pas trouvé de segment du prix par les filtres que j'ai spécifiés.

 
rigonich:

Vous n'avez pas d'ordre sélectionné dans la fonction Trade ().


Ça existe. Voici la solution.

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу
       
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }
  }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

Et la fonction de modification est la suivante :

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

Étrange Mais il n'y a pas d'arrêts et de prises sur la sortie à nouveau.

 
TUNGUS:


Nous avons besoin d'un programme qui, lorsqu'il est lancé dans l'archive des cartes

Les sections de mouvement de prix seront marquées visuellement avec les paramètres spécifiés en termes de force et de temps du mouvement.

Par exemple - une correction de 400 points effectuée en 30 minutes. Et donc pour toute l'année, toutes les corrections dans cette fourchette.

Il est impossible de les observer visuellement à la main. Distorsions. J'aimerais avoir un code couleur qui permettrait de les voir immédiatement.

___

J'ai regardé, il y a différents programmes "Histoty". Mais ils ne visualisent que l'historique du compte.

Mais je n'ai pas pu trouver un segment du prix selon les filtres donnés.


History, History_Draw - ils fonctionnent comme des conseillers experts dans les tests.

J'ai besoin de quelque chose comme ça, pour surveiller les corrections dans l'historique selon les paramètres donnés.

 

Problème avec Symbol() MT4 :

2 fonctions pour illustrer :

string   SymbolOK()
{

   string   value;
   string   argument = "ANYTHING";

   if(false)
   {
      value = argument;
   }

   return(value);

}

string   SymbolPROBLEM()
{

   string   value;
   string   argument = Symbol();

   if(false)
   {
      value = argument;
   }

   return(value);

}

L'exécution du premier produit une chaîne vide :

int start()
{
   Comment(SymbolOK());
   return(0);
}

Mais la deuxième fonction produit une chaîne ID "EURUSD" (enfin, cela dépend du graphique, mais produit, bien que selon la logique de la fonction, ce devrait être une chaîne vide) :

int start()
{
   Comment(SymbolPROBLEM());
   return(0);
}

Aidez-moi à comprendre ce qui ne va pas. Merci.

Raison: