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

 

L'EA possède le bloc suivant (compteur d'événements) :

if (isCloseLastPosByStop()==True) //Si le dernier ordre a été fermé par Stop

{
N=N+1 ;
Alert(N, " moose ") ;
} sinon N=0 ;

QUESTION : comment écrire les données dans un fichier (excel) au lieu de les afficher à l'écran ?

 
Dimka-novitsek:

Bonjour, pourriez-vous me dire comment cela peut être, je sélectionne une commande dans une boucle, je passe par la dernière commande et je la mémorise ainsi ticket = OrderTicket() ;

Dans ce cas, disons que c'est le numéro deux. Un peu plus tard si (ticket>-1){
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY) ;

et je reçois souvent l'erreur 4105 - commande non sélectionnée !!!


Et c'est parce que la commande n'a pas encore été clôturée. Il n'est pas dans MODE_HISTORY, il est toujours dans MODE_TRADES.
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

Pas question ! Pourquoi pas ? Il n'y avait aucun ordre ouvert au moment du dépassement ! Peut-être que je ne comprends pas.

Le cycle de recherche est aussi sur l'histoire ! C'est là que je l'assigne à la variable int ticket !

Et il jure, excusez-moi, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30 : Alerte : SELL Select error HISTORYticket 4105

Quand il passe de MODE_HISTORY à MODE_TRADES ?

Et surtout, je sélectionne le même ordre dans l'historique à l'aide de la sélection d'ordre, et il est sélectionné en premier, sinon je ne pourrais pas travailler avec lui ! Il n'y a aucune logique ! !!!!! Je suis choqué...




 
Dimka-novitsek:

Pas question ! Pourquoi pas ? Il n'y avait aucun ordre ouvert au moment du dépassement ! Peut-être que je ne comprends pas.

Le cycle de recherche est aussi sur l'histoire ! C'est là que je l'assigne à la variable int ticket !

Et il jure, excusez-moi, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30 : Alerte : SELL Select error HISTORYticket 4105

Quand il passe de MODE_HISTORY à MODE_TRADES ?


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
Ajout d'une ligne au début et correction des deux lignes de code suivantes.
 
Merci ! !!
 

aide à insérer un stop loss dans un EA

s'il vous plaît

Dossiers :
my_1.mq4  10 kb
 
Veuillez partager la fonction permettant de calculer le lot maximum autorisé en tenant compte des positions ouvertes, c'est-à-dire des fonds propres. La fonction standard calcule le risque, mais s'il y a des transactions, il n'y a pas assez d'argent pour les ouvrir.
 
T-G:
Veuillez partager la fonction permettant de calculer le lot maximum autorisé en tenant compte des positions ouvertes, c'est-à-dire des fonds propres. La fonction standard calcule le risque, mais s'il y a des transactions, il n'y a pas assez d'argent pour les ouvrir.


Dans le cas le plus simple, c'est comme ça :

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

Les gars, pouvez-vous nous conseiller sur cette question ?

Voici un script pour trouver la taille maximale du contrecoup en zig-zag de crenfx - voir ici:

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

Je le lance sur le graphique de l'instrument sur M5 - cela fonctionne bien avec l'horizon temporel par défaut

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

c'est la profondeur maximale de l'historique du symbole dans le bureau Alpari lorsqu'on le charge avec F2 - je l'ai vérifié, c'est-à-dire qu'il ressemble au contenu de l'onglet "Experts" du terminal client - cela semble vrai :

Lorsque j'utilise la même conception de script dans mon EA sur le même intervalle de temps sur la même période de graphique M5, il ne compte pas correctement, c'est-à-dire que

il calcule des nombres très différents (plus petits que dans le script) ou 0. Quelle peut être l'erreur ou l'incohérence de l'histoire ? Merci.

Par exemple, je démarre dans le testeur avec le hibou après le temps estimé pour trouver un failsafe, en théorie tout est normal et les chiffres à la fin du script et du hibou devraient être les mêmes... Quelle pourrait être l'erreur ?

 

C'est ainsi que je charge ce script à ma chouette :

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

Tout semble être identique - quelle pourrait être l'erreur ?