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

 
sss2019:

Je comprends que je ne veuille pas spéculer, mais pouvez-vous au moins me donner un indice si le problème est clair pour vous ?

Donnez-moi tout le code
 
ilunga:

Non, cela signifie seulement que les données correspondent à un morceau d'histoire.

Vous auriez pu le saisir manuellement, par exemple. Ou écrit à partir d'un fichier texte. Ou vous pourriez l'avoir obtenu par un calcul.


Parce que même en entrant des données conditionnelles "1,25 1,16 1,73 1,35", nous pouvons obtenir l'historique d'une monnaie il y a plusieurs années. Mais cela ne signifie pas que nous avons mis en place un tableau chronologique.

J'ai un peu modifié le script original :

1. J'ai copié seulement 5 derniers prix d'ouverture dans le tableau personnalisé.

2. Calculer le tableau personnalisé obtenu par les 5 prix d'ouverture copiés.

/+------------------------------------------------------------------------------------------+
//|                                                                ArrayGetAsSeries_плюс.mq4 |
//+------------------------------------------------------------------------------------------+
//|                         script program start function                                    |
//+------------------------------------------------------------------------------------------+
//------------------------------------ НАЧАЛО START -------------------------------------- 1 -
int start()                                           //функция start
  {                                                   //начало start
   double Timestart=GetTickCount();                   //переменная, с помощью которой вычисляется время (в милисекундах) начала выполнения эксперта 
   double array1[];                                   //объявляем массив-приемник (массив, куда будут скопированы данные)
   int element=ArrayCopy(array1,Open,0,0,5);          //копируем данные по максимальным ценам в пользовательский массив (начиная с 1-о бара, а не с нулевого)
   int size=ArraySize(array1);                        //устанавливаем количество элементов массива array1
//----------------------------------------------------------------------------------------- 2 -
   Comment("\nФункция ArrayCopy(array1[],Open,0,0,WHOLE_ARRAY) вернула: ",element,
           "\nФункция ArraySize(array1) вернула: ",size,
           "\nЗначение цены открытия бара №0 равно ",array1[0],"; Время цены открытия бара №0: ",TimeToStr(iTime(NULL,0,0),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №1 равно ",array1[1],"; Время цены открытия бара №1: ",TimeToStr(iTime(NULL,0,1),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №2 равно ",array1[2],"; Время цены открытия бара №2: ",TimeToStr(iTime(NULL,0,2),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №3 равно ",array1[3],"; Время цены открытия бара №3: ",TimeToStr(iTime(NULL,0,3),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №4 равно ",array1[4],"; Время цены открытия бара №4: ",TimeToStr(iTime(NULL,0,4),TIME_DATE|TIME_MINUTES),
           "\nФункция ArrayGetAsSeries(array1) вернула: ",ArrayGetAsSeries(array1),
           "\nСкрипт выполнялся всего ",GetTickCount()-Timestart," миллисекунд, из них: ",MathFloor((GetTickCount()-Timestart)/1000),
           " секунд ",((GetTickCount()-Timestart)/1000-MathFloor((GetTickCount()-Timestart)/1000))*1000," миллисекунд");//печать 
           //сообщения на экран
//----------------------------------------------------------------------------------------- 3 -
   return(0);                                                             //выход из start
  }                                                                       //конец start
//-------------------------------------- КОНЕЦ START -------------------------------------- 4 -

Voici ce que j'ai obtenu :


Comme vous pouvez le voir sur la figure, les prix ouverts sont indexés dans l'ordre inverse (comme en témoignent le NOMBRE de prix ouverts en barre (dans l'ordre croissant) et le TEMPS de prix ouverts en barre (dans l'ordre décroissant)), c'est-à-dire que le tableau est organisé comme un tableau-série temporelle.

Mais la fonction ArrayGetAsSeries renvoie néanmoins 0 (faux), ce qui signifie : le tableau utilisateur n'est PAS organisé comme un tableau-temps.

Demande de clarté très aimable

Question: comment expliquer cela ?

P.S. Merci d'avoir répondu à mes questions.

 
7777877:

J'ai un peu modifié le script original :

1. J'ai copié seulement les 5 derniers prix d'ouverture dans un tableau personnalisé.

2. Ras a traité le tableau personnalisé résultant par les 5 prix d'ouverture copiés.

Voici ce que j'ai obtenu :

Comme vous pouvez le voir sur la figure, les prix ouverts sont indexés dans l'ordre inverse (comme en témoignent le NOMBRE de prix ouverts en barre (dans l'ordre croissant) et le TEMPS de prix ouverts en barre (dans l'ordre décroissant)), c'est-à-dire que le tableau est organisé comme un tableau-série temporelle.

Mais la fonction ArrayGetAsSeries renvoie néanmoins 0 (faux), ce qui signifie : le tableau utilisateur n'est PAS organisé comme un tableau-temps.

Veuillez préciser

Question: comment l'expliquer ?

P.S. Merci d'avoir répondu à mes questions.

Avez-vous essayé d'utiliser le

boolArraySetAsSeries(void array[], bool set)
Définit la direction d'indexation d'un tableau. Unensemble VRAI définit la direction de l'indexation dans l'ordre inverse, c'est-à-dire que le dernier élément a un indice de zéro. Une valeur de FALSE définit la direction normale d'indexation. La fonction renvoie l'état précédent.
Paramètres :
tableau[]-Tableau numérique à définir.
set-La direction dans laquelle le tableau est indexé.
 
Vinin:

Avez-vous essayé les fonctions

boolArraySetAsSeries(void array[], bool set)
Définit la direction d'indexation du tableau. Unevaleur deset TRUE définit la direction de l'indexation dans l'ordre inverse, c'est-à-dire que le dernier élément a un indice de zéro. Une valeur de FALSE définit la direction normale d'indexation. La fonction retourne l'état précédent.
Paramètres :
tableau[]-Tableau numérique à définir.
set-La direction dans laquelle le tableau est indexé.

Mon objectif à ce stade est de comprendre le fonctionnement d'une fonction particulière, et dans ce cas précis, le fonctionnement de la fonction ArrayGetAsSeries. J'ai cru comprendre que je pouvais utiliser la fonction ArraySetAsSeries avec le paramètre set=true, qui définit de manière forcée l'indexation, comme dans array-timeseries. Mais je veux comprendre pourquoi, dans mon cas, la fonction ArrayGetAsSeries renvoie 0, alors que le tableau ressemble à une série chronologique (c'est-à-dire qu'il est indexé comme une série chronologique).
 
Sepulca:


i_maTF == Période() ? ?????

i_maPeriod prend une valeur raisonnable ???

Peut-être que quelque chose ne va pas avec i_maShiftByPrice ???

Il est difficile d'être plus précis.

Les informations qu'il produit ne sont pas correctes. Voici le code complet :

#property copyright "hoz"
#property link      ""
#include <stderror.mqh>
#include <stdlib.mqh>

extern string  h1 = "основные параметры машки";
extern int     i_maTF = 0;
extern int     i_maPeriod = 50;
extern int     i_maShiftByPrice = 0;
extern int     i_maMethod = 0;
extern int     i_maPrice = 0;
extern int     i_shiftBarsBack1 = 1;                        // Первое значение shift
extern int     i_shiftBarsBack2 = 49;                       // Второе значение shift
extern string  h2 = "===============================";

string         h3 = "Значения цены и времени в точках А и В гипотенузы";
double         price1,                                      // Цена в точке А
               price2,                                      // Цена в точке В
               time1,                                       // Время в точке А
               time2,                                       // Время в точке В
string         h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double         varsPrice1[100],                             // Буфер для цены в точке А
               varsPrice2[100],                             // Буфер для цены в точке В
               varsTime1[100],                              // Буфер для времени в точке А
               varsTime2[100],                              // Буфер для времени в точке В

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Red
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexBuffer(0,varsAngle);                          // Связываем массив значений угла с буфером
   SetIndexStyle(0,DRAW_HISTOGRAM); 
   
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {

// -------------- блок деинициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
   int i, countedBars = IndicatorCounted();
   int limit = Bars - countedBars;
   if (limit > 100) limit = 100;
        
   for(i = limit - 1;i > 0;i--)
    {
      price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i);       // Цена в точке А
      price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i);       // Цена в точке В
      time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1);                                               // Время в точке А
      time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1);                                               // Время в точке В
    
      Print("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
      string error = GetMyLastError2();
      
  //    Print("vars", DoubleToStr(price1,5));
    //  Print("vars", DoubleToStr(varsPrice1[i],5));
      
      varsPrice1[i] = price1;                                                                        // Массив цен в точке А
      varsPrice2[i] = price2;                                                                        // Массив цен в точке В
      varsTime1[i] = time1;                                                                          // Массив времени в точке А
      varsTime2[i] = time2;                                                                          // Массив времени в точке В
    
   
  //    Print("vars", DoubleToStr(varsPrice1[i],5));

            
      double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
      double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
      
  //    Print("d = ", d, " h = ", h);
      
      double angle = h/d;
      varsAngle[i] = angle;
    }
   return(0);
  }
  
string GetMyLastError2()
  {
    int err = GetLastError();
    string serr = ErrorDescription(err);
    return(serr);
  }

/* //+------------------------------------------------------------------+
//|                  Функция рассчёта тангенса угла                  |
//+------------------------------------------------------------------+
double TanA(double d, double h)
 {
   double angle = h/d;
   
  return(0);
 }
// -------------- блок деинициализации закончен ---------------------- */

Le journal du conseiller expert montre ceci :







14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 25 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 24 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 23 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 22 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 21 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 20 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 19 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 18 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 17 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 16 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 15 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 14 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 13 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 12 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 11 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 10 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 9 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 8 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 7 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 6 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 5 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 4 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 3 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 2 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 1 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7

Comme vous pouvez le voir, les variables i_maTF, i_maPeriod et i_maPrice ne sont pas celles que j'ai initialisées. Qu'est-ce qu'il y a ?

 
hoz:

Sort les mauvaises informations. Voici le code complet :

Le journal de l'expert montre ceci :

Comme vous pouvez le constater, les variables i_maTF, i_maPeriod et i_maPrice ne sont pas les mêmes que celles que j'ai initialisées. Qu'est-ce qu'il y a ?

Je me demande comment vous avez réussi à obtenir quelque chose dans le journal si le code que vous avez soumis ne compile pas ?

Ah, si vous le compilez, il n'y aura pas de bizarrerie.

Dossiers :
hoz_1.mq4  4 kb
 
TarasBY:

Je me demande comment vous avez réussi à obtenir quelque chose dans le journal si le code que vous avez présenté ne compile pas ?

Ah, si vous le compilez, vous n'aurez pas de bizarreries.

Je compile toujours normalement.

J'ai nettoyé le code des imprimantes et variables supplémentaires afin de ne pas embrouiller les gens. Mais je ne les ai pas supprimés ci-dessous, donc ça n'a pas compilé. Voici le code complet qui se compile :

//+------------------------------------------------------------------+
//|                                                    AngleByTg.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#include <stderror.mqh>
#include <stdlib.mqh>

extern string  h1 = "основные параметры машки";
extern int     i_maTF = 0;
extern int     i_maPeriod = 50;
extern int     i_maShiftByPrice = 0;
extern int     i_maMethod = 0;
extern int     i_maPrice = 0;
extern int     i_shiftBarsBack1 = 1;                        // Первое значение shift
extern int     i_shiftBarsBack2 = 49;                       // Второе значение shift
extern string  h2 = "===============================";

string         h3 = "Значения цены и времени в точках А и В гипотенузы";
double         price1,                                      // Цена в точке А
               price2,                                      // Цена в точке В
               time1,                                       // Время в точке А
               time2,                                       // Время в точке В
               angle;                                       // Значение возвращаемой тангенсом
string         h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double         varsPrice1[100],                             // Буфер для цены в точке А
               varsPrice2[100],                             // Буфер для цены в точке В
               varsTime1[100],                              // Буфер для времени в точке А
               varsTime2[100],                              // Буфер для времени в точке В
               varsAngle[100];                              // Буфер для хранения значение угла

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Red
//#property indicator_minimum -90
//#property indicator_maximum 90
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexBuffer(0,varsAngle);                          // Связываем массив значений угла с буфером
   SetIndexStyle(0,DRAW_HISTOGRAM); 
   
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {

// -------------- блок деинициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
 //   if (!isNewBar())
 //   return(0);
    
   int i, countedBars = IndicatorCounted();
   int limit = Bars - countedBars;
   if (limit > 100) limit = 100;
        
   for(i = limit - 1;i > 0;i--)
    {
      price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i);       // Цена в точке А
      price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i);       // Цена в точке В
      time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1);                                               // Время в точке А
      time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1);                                               // Время в точке В
    
      Print("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
      string error = GetMyLastError2();
      
      
//      Print("i = ", i," time1 = ", time1, " price1 = ", price1);
  //    Print("vars", DoubleToStr(price1,5));
    //  Print("vars", DoubleToStr(varsPrice1[i],5));
      
      varsPrice1[i] = price1;                                                                        // Массив цен в точке А
      varsPrice2[i] = price2;                                                                        // Массив цен в точке В
      varsTime1[i] = time1;                                                                          // Массив времени в точке А
      varsTime2[i] = time2;                                                                          // Массив времени в точке В
    
   
  //    Print("vars", DoubleToStr(varsPrice1[i],5));
    
      //Print("i = ", i," time1 = ", time1, " price1 = ", price1);
    //  Print("i = ", i," time2 = ", time2, " price2 = ", price2);
  //    Print("i = ", i," varsTime1[i] = ", varsTime1[i], " varsPrice1[i] = ", varsPrice1[i]);
     // Print("i = ", i," varsTime2[i] = ", varsTime2[i], " varsPrice2[i] = ", varsPrice2[i]);
            
      double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
      double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
      
  //    Print("d = ", d, " h = ", h);
      
      double angle = h/d;
      varsAngle[i] = angle;
      
 //     Print("i = ", i," varsAngle[i] = ", varsAngle[i]);
    }
   return(0);
  }
  
string GetMyLastError2()
  {
    int err = GetLastError();
    string serr = ErrorDescription(err);
    return(serr);
  }

/* //+------------------------------------------------------------------+
//|                  Функция рассчёта тангенса угла                  |
//+------------------------------------------------------------------+
double TanA(double d, double h)
 {
   double angle = h/d;
   
  return(0);
 }
// -------------- блок деинициализации закончен ---------------------- */
Dossiers :
anglebytg.mq4  6 kb
 

Aidez-moi ! Comment faire pour qu'un EA ferme un ancien ordre lorsqu'il en ouvre un nouveau ? Dans le testeur de stratégie, cela fonctionne bien, mais sur le compte réel, pour une raison quelconque, lorsque j'en ouvre un nouveau, l'ancien quitte ????????. Je suis un zéro total en programmation(((

//---- input parameters
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_SELL=true;
extern int SL_sell=62; //---входные параметры по шортам
extern int Risk_sell=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo

//---- other parameters
static int prevtime=0;
int ticket=0;
int x=1;
//----------------------------------------------
int Magic_BUY =123;
int Magic_SELL =321;


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
if(Digits == 5) x=10;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//oooooooooooooooooooooooooooooooooooooooooooooooooooo
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
if (!IsTradeAllowed()) {
prevtime=Time[1]; MathSrand(TimeCurrent());Sleep(30000 + MathRand()); //--- формировка бара---
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO


Trade( Magic_BUY, In_BUY,Ask,0,2, SL_buy, Risk_buy); //---торговля по лонгам


Trade(Magic_SELL,In_SELL,Bid,2,0, SL_sell,Risk_sell); //---торговля по шортам


//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
return(0);//-----------выход из стартовой функции------------
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void Trade(int mn,bool flag,double price,int period_1,int period_2,int sl,int Risk) {

int total=OrdersTotal();

for (int i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES);//---проход по ордерам--


if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {

if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------

OrderClose(OrderTicket(),OrderLots(),price,5*x); RefreshRates();

}

return(0);
}
}

//ooooooooooooooooooooooooooooooooooooooooooooooooooo
ticket = -1;



if ( flag &&

Open[period_1]>Open[period_2] && //----вход в рынок по условию---


OrdersTotal()<2 && //-----ограничения чемпионата------

AccountEquity()>200 &&

IsTradeAllowed()) {

if (mn<200) {

ticket= OrderSend(Symbol(), OP_BUY,lot(Risk_buy),Ask,5,Bid-x*sl*Point,0,DoubleToStr(mn,0),mn,0,Blue);


}


else {

ticket= OrderSend(Symbol(),OP_SELL,lot(Risk_sell),Bid,5,Ask+x*sl*Point,0,DoubleToStr(mn,0),mn,0, Red);

}


RefreshRates();

if ( ticket < 0) { Sleep(30000); prevtime = Time[1]; }

} //-- Exit ---

return(0); }


//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
double lot(int R) { if (R<0)R=0; if (R>80)R=80; //------корректность ввода -------
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
int o = MathAbs(MathLog(minlot) *0.4343) + 0.5;
double lot = minlot;
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
lot = NormalizeDouble(AccountFreeMargin() * 0.00001*R, o);//---
if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) {
lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), o);
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
if(lot < minlot) lot = minlot;
double maxlot =MarketInfo(Symbol(), MODE_MAXLOT);
if(lot > maxlot) lot = maxlot;
return(lot); }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_end_film_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Ou peut-être écrire un autre EA qui fonctionnerait sur le principe de 1 a ouvert, 2 a ouvert-1 a fermé, 3Ouvré-2 a fermé, etc. L'aide est vraiment, vraiment nécessaire ! !!
 
al7bar:

Aidez-moi ! Comment faire pour qu'un EA ferme un ancien ordre lorsqu'il en ouvre un nouveau ? Dans le testeur de stratégie, cela fonctionne bien, mais sur le compte réel, pour une raison quelconque, lorsque j'en ouvre un nouveau, l'ancien quitte ? ???????. Je n'ai pas la moindre idée de la programmation(( !)

//---- input parameters
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;

Remplacer

if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------

 OrderClose(OrderTicket(),OrderLots(),price,5*x); RefreshRates(); 

 }

à

if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------

 OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5*x); RefreshRates(); 

 }
 
7777877:
À ce stade, mon objectif est de comprendre comment fonctionne telle ou telle fonction et, dans ce cas précis, comment fonctionne la fonction ArrayGetAsSeries. J'ai cru comprendre que vous pouvez utiliser la fonction ArraySetAsSeries avec le paramètre set=true, qui définit de manière forcée l'indexation, comme dans array-timeseries. Mais je veux comprendre pourquoi, dans mon cas, la fonction ArrayGetAsSeries renvoie 0, alors que le tableau ressemble à une série chronologique (c'est-à-dire qu'il est indexé comme une série chronologique).

Précisément parce qu'il ne s'agit que d'une série chronologique.

Ce n'est que votre opinion personnelle. Et si vous y mettez les chiffres 1, 2, 1.2, 2.1, vous obtenez une série chronologique pour le porc à partir de 1927 (les chiffres sont conditionnels). Mais cela ne fait pas du tableau une série temporelle - vous devez le spécifier explicitement avec la fonction