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

 
Bonjour Professionnels, veuillez me conseiller ! Comment dois-je écrire dans l'EA, de sorte que lorsqu'un pari est annulé, l'EA prend un nouveau pari dans la direction opposée sur la même barre (comme un "flip"). Je teste avec le modèle "quand une nouvelle barre s'ouvre". Pour l'exemple EA:
//+------------------------------------------------------------------+
//|                                                      CrossMa.mq4 |
//|                      Copyright © 2005, George-on-Don             |
//|                                       http://www.forex.aaanet.ru |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
#include <stderror.mqh>
 
#define MAGICMA  20050610
 
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 12;
extern double MovingShift        = 0;
extern double MovingPeriod1      = 4;
extern double AtrPer             = 6;
extern bool   SndMl              = True ;
//+------------------------------------------------------------------+
//| Расчет открытия позиции                                          |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Расчет оптимальной величины лота                                 |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Проверка для открытия позиции с первым тиком нового бара.        |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   double Atr;
   int    res;
   string sHeaderLetter;
   string sBodyLetter;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,2);// короткий мувинг 4
   Atr = iATR(NULL,0,AtrPer,0);
 //---- Условие продажи
   if(maf<mas && maf_p>=mas_p)  
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
       if (SndMl == True && res != -1) 
         {
         sHeaderLetter = "Operation SELL by" + Symbol()+"";
         sBodyLetter = "Order Sell by"+ Symbol() + " at " + DoubleToStr(Bid,4)+ ", and set stop/loss at " + DoubleToStr(Ask+Atr,4)+"";
         sndMessage(sHeaderLetter, sBodyLetter);
         }
      return;
     }
//---- Условие покупки
   if(maf>mas && maf_p<=mas_p)  
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      if ( SndMl == True && res != -1)
      { 
      sHeaderLetter = "Operation BUY at" + Symbol()+"";
      sBodyLetter = "Order Buy at"+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and set stop/loss at " + DoubleToStr(Bid-Atr,4)+"";
      sndMessage(sHeaderLetter, sBodyLetter);
      }
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| ПРоверка для закрытия открытой позиции                           |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   string sHeaderLetter;
   string sBodyLetter;
   bool rtvl;
//---- 
   if(Volume[0]>1) return;
//----  
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,2);// короткий мувинг 4
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //----  
      if(OrderType()==OP_BUY)
        {
         if(maf<mas && maf_p>=mas_p) rtvl=OrderClose(OrderTicket(),OrderLots(),Bid,3,Lime);
            if ( SndMl == True && rtvl != False )
            {
            sHeaderLetter = "Operation CLOSE BUY at" + Symbol()+"";
            sBodyLetter = "Close order Buy at"+ Symbol() + " for " + DoubleToStr(Bid,4)+ ", and finish this Trade";
            sndMessage(sHeaderLetter, sBodyLetter);
            }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(maf>mas && maf_p<=mas_p) rtvl=OrderClose(OrderTicket(),OrderLots(),Ask,3,Lime);
         if ( SndMl == True && rtvl != False ) 
         {
         sHeaderLetter = "Operation CLOSE SELL at" + Symbol()+"";
         sBodyLetter = "Close order Sell at"+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and finish this Trade";
         sndMessage(sHeaderLetter, sBodyLetter);
         }
         break;
        }
     }
//----
  }
  
//--------------------------------------------------------------------
// функция отправки ссобщения об отрытии или закрытии позиции
//--------------------------------------------------------------------
void sndMessage(string HeaderLetter, string BodyLetter)
{
   int RetVal;
   SendMail( HeaderLetter, BodyLetter );
   RetVal = GetLastError();
   if (RetVal!= ERR_NO_MQLERROR) Print ("Ошибка, сообщение не отправлено: ", ErrorDescription(RetVal));
}
//+------------------------------------------------------------------+
//| Майн функция                                                     |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<25 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
Merci !
 

Bon après-midi. Question sur la fonction standard SendMail... Afin decomprendre le fonctionnement de la fonction, j'ai écrit ce script:

//+------------------------------------------------------------------+
//|                                             функция_SendMail.mq4 |
//|                      Copyright © 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//+------------------------------------------------------------------+

SendMail("Скрипт Функция_SendMail","Webmoney - идите в жопу!!!!");
Alert(GetLastError());
   
//+------------------------------------------------------------------+   
   return(0);
  }
//+------------------------------------------------------------------+

Lors de l'exécution dans la fenêtre du terminal client, une erreur apparaît dans le journal:

Dans les paramètres (menu du terminal client Outils -> Paramètres -> onglet Courrier), les paramètres suivants sont définis :

Au lieu de trois points dans les champs SMTP login et From Whom, il y a le nom de la boîte aux lettres à partir de laquelle je veux envoyer le message, et dans le champ To - le nom de la boîte aux lettres à laquelle je veux envoyer le message.

En même temps, lenuméro de port spécifié dans lechamp Serveur SMTP est réellement 25:

Remarque : la capture d'écran a été réalisée dans la section Aide du courrier.Ru.

Question: qu'est-ce que cette erreur et comment s'en débarrasser ? Le compilateur n'affiche pas d'erreurs et la fonction GetLastError() renvoie 0.

P.S. Pour ne pas encombrer le forum, merci d'avance pour votre réponse.

 
7777877:

Bon après-midi. Question sur la fonction standard SendMail... Afin decomprendre le fonctionnement de la fonction, j'ai écrit ce script:

Lors de l'exécution dans la fenêtre du terminal client, une erreur apparaît dans le journal:

Dans les paramètres (menu du terminal client Outils -> Paramètres -> onglet Courrier), les paramètres suivants sont définis :

Au lieu de trois points dans les champs SMTP login et From Whom, il y a le nom de la boîte aux lettres à partir de laquelle je veux envoyer le message, et dans le champ To - le nom de la boîte aux lettres à laquelle je veux envoyer le message.

En même temps, lenuméro de port spécifié dans lechamp Serveur SMTP est réellement 25:

Remarque : la capture d'écran a été réalisée dans la section Aide du courrier.Ru.

Question: qu'est-ce que cette erreur et comment s'en débarrasser ? Le compilateur n'affiche pas d'erreurs et la fonction GetLastError() renvoie 0.

P.S. Pour ne pas encombrer le forum, merci d'avance pour votre réponse.

Regardez le port et le cryptage. Vous devriez peut-être le régler sur 2525.
 

Aidez-nous, s'il vous plaît.

Voici le code


//-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }

if (Sum_Loss < 0.0) { // Имеем убыток по закрытым позам
double money = Lots;
   BuyLots = GetBuyLotsSum();
        SellLots = GetSellLotsSum();
        if(BuyLots  > SellLots)money = BuyLots * 10;
        if(BuyLots  < SellLots)money = SellLots * 10;
  if (((AccountEquity() + Sum_Loss + (Sum_Loss / money)) >= AccountBalance()) && (((totalSell > 0) && (totalBuy < 1)) || ((totalSell < 1) && (totalBuy > 0)))) { // Достигли безубытка
    // Здесь какой-то код, который необходимо выполнить при достижении безубытка
        CloseAllBuy();
           CloseAllSell();
           Sum_Loss = 0.0;
           

Je n'ai aucun moyen de faire en sorte qu'une boucle s'ouvre lorsqu'une transaction a été clôturée en négatif et que si la commande suivante a été clôturée au-dessus de zéro, c'est-à-dire un solde positif, mais inférieur au négatif, on ajoute le plus au négatif et on obtient une nouvelle valeur négative, qui est déjà inférieure.

if(OrderProfit() >= 0 && Sum_Loss < 0.0)
                  double lastLoss_two = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss_two;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
               }

S'il est plus négatif, selon le signal, nous fermons l'ordre et recommençons le cycle depuis le début.


La situation est que lorsque ce code ferme la transaction en perte, alors il se souvient du solde négatif, et lorsqu'il ferme la transaction en plus, et que le plus est inférieur au solde, alors il réinitialise Sum_Loss et j'ai besoin qu'il n'ait pas été mis à zéro, et fauché.

C'est donc comme ça que ça fonctionne maintenant :

il vérifie un ordre fermé, si le profit de l'ordre fermé est inférieur à zéro, alors ce profit est ajouté à Sum_Loss, et ainsi de suite jusqu'à ce que le profit de la transaction ouverte dépasse (sera supérieur à) Sum_Loss, lorsqu'il est atteint, la transaction est fermée, et Sum_Loss est remis à zéro et le cycle recommence.

J'en ai besoin :

Si l'ordre suivant s'est clôturé avec un profit positif, Sum_Loss est réduit du montant dérivé du profit, ce qui signifie que le prochain ordre ouvert Sum_Loss est déjà plus petit, et ainsi de suite jusqu'à ce que le profit de l'ordre soit supérieur à Sum_Loss, et alors Sum_Loss est effacé et un nouveau cycle commence.

Sum_Loss = 0 ;

1er ordre fermé : Profit (-50) < 0

Somme_Perte + bénéfice (Somme_Perte + (-50))

Sum_Loss = -50 ;

2ème ordre fermé : Profit (+40) > 0 et Sum_Loss < 0

Somme_perte + bénéfice (Somme_perte + 40)

Sum_Loss = -10
 
7777877:

Bon après-midi. Question sur la fonction standard SendMail... Afin decomprendre le fonctionnement de la fonction, j'ai écrit ce script:

Lors de l'exécution dans la fenêtre du terminal client, une erreur apparaît dans le journal:

Dans les paramètres (menu du terminal client Outils -> Paramètres -> onglet Courrier), les paramètres suivants sont définis :

Au lieu de trois points dans les champs SMTP login et From Whom, il y a le nom de la boîte aux lettres à partir de laquelle je veux envoyer le message, et dans le champ To - le nom de la boîte aux lettres à laquelle je veux envoyer le message.

En même temps, lenuméro de port spécifié dans lechamp Serveur SMTP est réellement 25:

Remarque : la capture d'écran a été réalisée dans la section Aide du courrier.Ru.

Question: qu'est-ce que cette erreur et comment s'en débarrasser ? Le compilateur ne détecte pas les erreurs et la fonction GetLastError() renvoie 0.

P.S. Pour ne pas encombrer le forum, merci d'avance pour votre réponse.

aide

le serveur smtp.mail.ru:25 fonctionne vraiment

 
YOUNGA:

aide

Le serveur smtp.mail.ru:25 fonctionne vraiment.

Mon login de test, de qui, à qui, correspond.

Peut-être que les pare-feu se mettent en travers du chemin ?

Oh, mec, ça fait un million de conseils - réinitialise le terminal !


 

Aider les gens

Je place un ordre en attente au prix x. L'ordre est converti en un ordre au prix du marché au prix Y. Puis-je trouver quelque part à quel prix l'ordre en attente a été placé (dans le journal ...ou ) ou je devrai écrire mon propre tableau ?

 

Bonsoir !

Veuillez me conseiller sur la source possible de cette erreur. Je suis en train d'apprendre la langue, donc je suis un peu perdue.

La tâche du code Expert Advisor est de lire les données du fichier .scv (deux valeurs par ligne, 400 lignes) et de les écrire dans un tableau.

double signals_array[400][2];

int init()
  {

   int Handle;
      Handle=FileOpen("Signals.csv",FILE_CSV|FILE_READ,";");// Открытие файла
   if(Handle<0)                        // Неудача при открытии файла
      {
      if(GetLastError()==4103)         // Если файла не существует,..
         Alert("Нет файла");//.. извещаем трейдера 
      else                             // При любой другой ошибке..
         Alert("Ошибка при открытии файла");//..такое сообщ
         PlaySound("Bzrrr.wav");          // Звуковое сопровождение
         return;                          // Выход из start()      
      }

   for (int i = 0; i < 400; i++)
      {
      for (int j = 0; j < 2; j++)
         signals_array[i][j] = StrToDouble(FileReadString(Handle));
      }

Alert (signals_array[120][0],"; ",signals_array[0][1]," OK!");
//----
   return(0);
  }

Le problème est le suivant : si je lance l'EA sur un graphique, il affiche une alerte avec les valeurs correctes du tableau, mais si j'essaie de tester l'EA, il affiche une alerte "No file" dans le journal. En d'autres termes, il semble qu'il ne puisse pas accéder au fichier (bien que ce soit incroyable) et qu'il écrive des valeurs dans le tableau (ce qui est confirmé par une autre alerte), mais qu'il reste bloqué lorsqu'il trouve le fichier, selon le journal. Confus. Vous trouverez ci-dessous une capture d'écran.

 

alexeymosc:

Le problème est le suivant : si je lance le conseiller expert sur le graphique, il affiche une alerte avec les valeurs correctes du tableau, mais si j'essaie de tester le conseiller expert, il affiche l'alerte "No file" dans le journal. C'est-à-dire qu'il semble qu'il ne puisse pas accéder au fichier (bien que ce soit incroyable) et qu'il écrive des valeurs dans un tableau (ceci est confirmé par une autre alerte) mais qu'il se fige lorsqu'il trouve un fichier dans le journal. Confus.


Dans le testeur et sur la carte, les fichiers sont écrits et lus dans des répertoires différents :

  1. MetaTrader 4, testeur, experts, fichiers...
  2. MetaTrader 4 \experts \files
 
alexeymosc:

Bonsoir !

Veuillez me conseiller sur la source possible de cette erreur. Je suis en train d'apprendre la langue, donc je suis un peu perdue.

La tâche du code Expert Advisor est de lire les données du fichier .scv (deux valeurs par ligne, 400 lignes) et de les écrire dans un tableau.

Le problème est le suivant : si je lance l'EA sur un graphique, il affiche une alerte avec les valeurs correctes du tableau, mais si j'essaie de tester l'EA, il affiche une alerte "No file" dans le journal. En d'autres termes, il semble qu'il ne puisse pas accéder au fichier (bien que ce soit incroyable) et qu'il écrive des valeurs dans le tableau (ce qui est confirmé par une autre alerte), mais qu'il reste bloqué lorsqu'il trouve le fichier, selon le journal. Confus. Vous trouverez ci-dessous une capture d'écran.

Si un fichier est ouvert, il doit être fermé, même si une erreur est reçue en travaillant avec lui. Je ne vois pas d'autres erreurs jusqu'à présent.

On peut le lire comme ça :

signals_array[i][j] = FileReadDouble(Handle);
Raison: