[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 227

 
Optim:

Chers collègues-professionnels, j'ai besoin de votre aide (pli-is). Je veux faire une fonction dans mon EA qui affiche une notification dans le coin arrière de l'écran au sujet de la tendance actuelle sur différents timeframes et le renversement à venir. J'utilise mes fonctions LinearRegression et Diverg à cette fin, mais je n'ai jamais travaillé avec la fonction Comment et je ne peux donc pas comprendre où j'ai fait une erreur. Quoi qu'il en soit, le code ci-dessous affiche uniquement le message "Trend W = Down" mais je veux qu'il m'informe sur d'autres TFs.

void UPDN ()
{
if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diverg_Per_H1, 0) < 0) Comment("Trend H1 = Up")
if(Diverg(LR_TFr_1,0,Diver_Per_H1)<0) Comment("...!Turn at H1 = Down") ;
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diverg_Per_H4, 0) < 0) Comment("Trend H4 = Up")
if(Diverg(LR_TFr_2,0,Diver_Per_H4)<0) Comment("...!H4 trend reversal = Down")
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) < 0) Comment("Trend D1 = Up")
if(Diverg(LR_TFr_3,0,Diver_Per_D1)<0) Comment("...!Pivot sur D1 = Down") ;
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) < 0) Comment("Trend W = Up") ;
if(Diverg(LR_TFr_4,0,Diver_Per_W)<0) Comment(" ;)

if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diverg_Per_H1, 0) > 0) Comment("Trend H1 = Down")
if(Diverg(LR_TFr_1,0,Diver_Per_H1)>0) Comment("...!H1 trend reversal = Up") ;
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) > 0) Comment("Trend H4 = Down")
if(Diverg(LR_TFr_2,0,Diver_Per_H4)>0) Comment("...!H4 trend reversal = Up") ;
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) > 0) Comment("Trend D1 = Down")
if(Diverg(LR_TFr_3,0,Diver_Per_D1)>0) Comment("...!Pivot sur D1 = Up") ;
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) > 0) Comment("Trend W = Down") ;
if(Diverg(LR_TFr_4,0,Diver_Per_W)>0) Comment("...!Diverg to W = Up")
retour(0) ;
}


voidComment(...)
La fonction émet un commentaire défini par l'utilisateur dans le coin supérieur gauche du graphique. Les paramètres peuvent être de n'importe quel type. Le nombre de paramètres ne peut pas dépasser 64.

Les tableaux ne peuvent pas être passés à Comment(). Les tableaux doivent être imprimés élément par élément.

Les données de type double sont éditées avec 4 chiffres décimaux après le point. Pour imprimer des nombres avec une plus grande précision, utilisez la fonctionDoubleToStr().
Les types bool, datetime et couleur seront imprimés sous forme de nombres.
Pour produire des données de type date-heure sous forme de chaîne, utilisez la fonctionTimeToStr().

Pour diviser la sortie en plusieurs lignes, vous pouvez utiliser le caractère de saut de ligne "\n" ou "\r\n".
Voir égalementAlert() etPrint().
Paramètres :
...-Toutes les valeurs, séparées par des virgules.
Exemple :
 double free=AccountFreeMargin() ; Comment("La marge libre du compte est ",DoubleToStr(free,2),"\n", "L'heure actuelle est ",TimeToStr(TimeCurrent()) ;
 
Lisez au moins la documentation avant de poser des questions. La moitié des réponses sont déjà là
 

Merci, j'ai compris. J'ai besoin d'entrer des variables selon les résultats des fonctions LinearRegression et Diverg pour chaque TF et ensuite de les sortir avec un commentaire, peut être en plusieurs lignes.

 
Optim:

Merci, j'ai compris. J'ai besoin d'entrer des variables selon les résultats des fonctions LinearRegression et Diverg pour chaque TF et ensuite de les sortir avec un commentaire, peut être en plusieurs lignes.


Il y a seulement une limitation en termes de longueur de ligne. Vous pouvez utiliser la fonction d'Alexander Pak. Si vous ne pouvez pas le trouver, je le chercherai moi-même.
 

Messieurs !

J'ai une question sur le passage d'un tableau par référence.

Le schéma de l'algorithme est le suivant :

Nous passons un tableau par référence d'une bibliothèque à une autre.

Nous le copions là en utilisant la fonction intégrée :

ArrayCopy.

Ensuite, le tableau passé par référence est utilisé

dans le premier module.

Mais pour une raison quelconque, une erreur se produit, et pas toujours.

C'est-à-dire que parfois le tableau est copié, parfois il ne l'est pas.

Quelle est la raison ?

L'entrée du journal est la suivante :

21:07:12 openHistory CADCHF,H1 :

2 plages de tableaux pour la fonction ArrayCopy (0 et 4)

Connexion du module

Copie

 
Roger:
C'est parce que tu as mal copié mon exemple. Regardez bien où est le i et où est le k.

J'ai corrigé le code selon le vôtre.
Lors du test, quatre ordres se sont fermés dans l'ordre où ils ont été définis au premier tick, le cinquième s'est fermé au tick suivant. Il y a probablement quelque chose d'autre qui ne va pas ici, car je l'ai testé plusieurs fois.
Je colle le code du programme et les journaux du testeur.
Sincèrement. Shurkin

Код программы.
//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс0:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
//   for(i=OrdersTotal()-1; i>=0; i--)//
   for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс1:"," Tick=",Tick," i=",i," k=",k);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера k
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;//?
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0, int k=0; i<OrdersTotal();i++,k++)
/*   
   for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс1:"," Tick=",Tick," i=",i," k=",k);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;//Зачем сначала прибавлять и тут же убавлять ???
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
*/   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.
2013.03.18 13:58:21     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=4 i=1 k=1
2013.03.18 13:58:21     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=4 i=0 k=0
2013.03.18 13:57:57     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=3 i=1 k=1
2013.03.18 13:57:57     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=3 i=0 k=0
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=2 i=1 k=0
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3394
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=2 i=0 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=3 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=2 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=1 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=0 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ0: OrdersTotal=7
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.18 13:57:09     Poligon1 test started
2013.03.18 13:57:02     Poligon1 EURUSD,M15: loaded successfully
 
Quel est le meilleur endroit pour déclarer un type de variable (int, double, etc.) en termes de réduction de la consommation de ressources lors de l'exécution du programme. Par exemple, int i peut être déclaré globalement ou dans int start() ... for (int i=OrdersTotal()-1 ; i>=0 ; i--) ... J'ai l'impression que le fait de le déclarer à chaque tick est plus coûteux que de le déclarer une fois au niveau global, juste après les paramètres externes. Ou la différence en termes d'intensité de ressources est-elle la même ?
 
Zhunko:
Tu dois faire une boucle au départ. Travaillez à l'intérieur de la boucle. On peut tout y faire.

C'est un peu différent. Lorsque la connexion est perdue, le journal indique "Ping failed". Cela signifie qu'il y a des réponses, mais qu'elles ne sont pas documentées pour une raison quelconque.
Dans quelle mesure la charge du processeur et de la mémoire est-elle augmentée par le bouclage ?

 
Dimka-novitsek:

Bonsoir ! Excusez-moi, je voudrais revenir sur un problème non résolu.

Acheter - Types incompatibles D:\TeleTRADE\experts/experts/clean.mq4 (102, 53)

Vendre' - types incompatibles D:\TeleTRADE\experts\clearlist.mq4 (102, 79)


if (!Pishem&&PozyProstavleny){SaveArray(FileBuy, Buy); SaveArray(FileSell, Sell); Pishem=1;}

Cette ligne ne compile pas.
 
//записать

void SaveArray(string File, double &a[])
{
    int h = FileOpen(File, FILE_BIN|FILE_WRITE);
    if(h>0)
    {
      int sz = ArraySize(a); 
      FileWriteArray(h,a,0,sz);
      FileClose(h);
    }
}

//прочитать

void OpenArray(string File, double &a[], int sz)
{
    int h = FileOpen(File, FILE_BIN|FILE_READ);
    if(h>0)
    {
      ArrayResize(a,sz);
      FileReadArray(h,a,0,sz);
      FileClose(h);
    }
}