Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1662

 
Taras Slobodyanik #:

pourquoi avez-vous besoin de 3 méthodes ?
il suffit de tout faire en une seule

  • vérifié la commande

- modifié
- non modifié

C'est intéressant !

Taras, disons que nous avons trois ordres d'achat avec TP et SL, puis dans un ordre nous modifions SL.

Question : Comment trouver la commande qui a été modifiée ?

 
Taras Slobodyanik #:

pourquoi avez-vous besoin de 3 méthodes ?
il suffit de tout faire en une seule

  • vérifié la commande

- modifié
- non modifié

Il y en a déjà deux, l'un contrôle la taille du tableau via OrdersTotal() où sont stockés les tickets des commandes modifiées, et l'autre recherche les tickets dans ce tableau. Mais maintenant, j'ai changé du code ailleurs, sans rapport avec tout cela, et pour une raison quelconque, je reçois une erreur (dépassement de tableau).
 
MakarFX #:

Intéressant !

Taras, disons qu'il y a trois ordres d'achat avec TP et SL, puis dans un ordre SL a été changé.

Question : Comment puis-je trouver l'ordre qui a été modifié ?

De toute évidence, le SL (ou TP) a été modifié pour une raison, n'est-ce pas ?
Nous devrions le vérifier en fonction de certaines conditions.

Ensuite, lors de la prochaine vérification, cette condition sera définie comme "remplie" - la commande a déjà été modifiée.


PS : Si nous parlons de modification manuelle, quelqu'un va changer quelque chose à l'insu d'EA, alors bien sûr nous devons collecter une structure de tableau et la comparer constamment avec les ordres du marché.

 
Taras Slobodyanik #:

pourquoi avez-vous besoin de 3 méthodes ?
il suffit de tout faire en une seule

  • vérifié la commande

- modifié
- non modifié

L'ordre n'est pas 1, disons qu'il y en a 10. J'écris le ticket de chaque modifié dans un tableau. Mais jusqu'à présent, c'est un problème.
 
MakarFX #:

Supprimé

MakarFX, merci ! Maintenant, il n'y a pas de premier ordre non-signal supplémentaire, mais maintenant, pour une raison quelconque, le premier ordre signal (normal) entre 2 bougies plus tôt))). J'ai joint une capture d'écran du testeur à mon message, mais même en dépit de cette première commande - la chose la plus importante est faite, merci beaucoup encore) Avec les magiciens l'ont obtenu, alors je vais faire une variable externe et quand j'attache l'espert à un graphique particulier de paire de devises, je vais changer le nombre pour chaque paire individuellement.

 
Nerd Trader #:
La commande n'est pas 1, il y a 10 commandes. Je vais écrire le ticket de chaque modifié dans le tableau. Mais jusqu'à présent, il y a un problème.

peu importe le nombre d'ordres - si le TP/SL n'a pas besoin d'être modifié, selon les conditions = l'ordre a déjà été modifié.

 
SanAlex #:

celui-là est bon pour s'amuser dans le testeur.

et celui-ci est pour vous, comme un cadeau - pour faire de l'argent.

\\\\\\\\\\\\\\\\\\\\\\\\\\

Je l'ai lancé pour le tester - nous verrons comment il fonctionne ce soir.

\\\\\\\\\\\\\\\\\\\\\\\\\\\

j'ai vérifié comment le motif change sur toutes les cartes - tout a fonctionné ! -comment le bénéfice global a atteint l'objectif.


SanAlex, très intéressant, je vais certainement examiner cette EA en détail, merci !

 

Les gars, bonne journée sur le conseil de code, voici un graphique sur la droite des deux métiers moins d'achat - est couvert par une vente, vente d'achat, selon l'algorithme devrait entrer dans l'achat, mais pourquoi - puis ces deux fi-tions, qui regardent et de produire un commerce moins le plus récent dans l'histoire - montrer les deux dans le plus ! Comment écrire et où l'erreur - ce TC flip, la moyenne - ces mêmes f-Its travailler correctement, en bref, après le moins-vendre - doivent ouvrir acheter, mais il ne s'ouvre pas, parce que En d'autres termes, il devrait ouvrir l'achat si mon ordre est perdant, mais l'achat ne s'ouvre pas, parce que le f-i pense que si la transaction perd le plus de bord, ce f-iia rapporté VRAI, sinon c'est faux, mais ils rapportent tous deux VRAI. Aidez-moi à décider.



// проверка предыдущего минусового селл
bool Calc_Loss_SELL()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) ==  DEAL_TYPE_BUY)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в селл разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В БАЙ разрешен ",TotalLot);
            break;
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


// проверка предыдущего минусового бай
bool Calc_Loss_BUY()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) == DEAL_TYPE_SELL)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в бай разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В СЕЛЛ разрешен ", TotalLot);
            break;          
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


    //----------------------------------------------
      // проверка условий ПЕРЕВОРОТА В СЕЛЛ
      // нет поз рыночных и предыдущая сделка В БАЙ была минусовая и не было минусового селла
       Print(" Calc_Loss_BUY(): ",Calc_Loss_BUY(), " Calc_Loss_SELL(): ",Calc_Loss_SELL());
      
      if(!PositionSelect(Symbol()) && Calc_Loss_BUY() && !Calc_Loss_SELL())
        {
         m_trade.Sell(CalcLot(),_Symbol,LastTick.bid,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point - _Spread*_Point);
         Print(" ПЕРЕВОРОТ БАЯ В СЕЛЛ, Calc_Loss_BUY(): ",Calc_Loss_BUY());
        }

 
      // проверка условий ПЕРЕВОРОТА в SELL
      // нет поз рыночных и предыдущий селл был минусовой И НЕ БЫЛО МИНУСОВОГО БАЙ
      
      if(!PositionSelect(Symbol()) && Calc_Loss_SELL() && !Calc_Loss_BUY())
        {
         m_trade.Buy(CalcLot(),_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point + _Spread*_Point);
         Print(" ПЕРЕВОРОТ СЕЛЛА В БАЙ, Calc_Loss_SELL(): ",Calc_Loss_SELL());
        }

Je n'arrive pas à ouvrir l'achat, mais il devrait l'ouvrir après une vente ubuesque !!!!!!!!!.


En substance, le problème se résume à déterminer le profit ou la perte a été fermé position marginale, qui est devenu un achat ou de vente de commerce et de regarder plus loin sur son type !

AIDE ! PLUS !

 

Bonne journée !

Il y a deux fonctions : une fonction pour calculer la grille entière des ordres et une fonction pour fermer les ordres.

//+------------------------------------------------------------------+
double CalculiteProfit()
{
    double oProfit = 0;
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
          if (OrderType() == OP_BUY || OrderType() == OP_SELL)
          {
            oProfit += OrderProfit();
          }
        }
      }
    }
    return(oProfit);
}
//+------------------------------------------------------------------+
 double FindLastBuyPrice()
{
   int oldticket, ticket = 0;
   double oldopenprice = 0;
   
   for(int cnt = OrdersTotal()-1; cnt>=0; cnt--)
   {
    if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
     {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
          oldticket = OrderTicket();
          if (oldticket > ticket)
          {
            ticket = oldticket;
            oldopenprice = OrderOpenPrice();
          } 
        }
     }
   }
   return(oldopenprice);
 }
//+------------------------------------------------------------------+

Il existe également des conditions pour les ordres de clôture

 double op = CalculiteProfit(); 
     if (op >= Profit)
     {
       ClosseAll();
     }

Bénéfice - dans les paramètres en devise de dépôt

L'idée de base : lorsque le calcul de la grille d'ordres est égal à zéro plus leprofit en monnaie de dépôt, toute la grille d'ordres est fermée.

Veuillez m'aider à modifier le code pour qu'il y ait des points au lieu de Profit. Merci.

 
Taras Slobodyanik #:

De toute évidence, le sl (ou tp) a été changé pour une raison, n'est-ce pas ?
Mais selon certaines conditions.

Ainsi, lors du prochain contrôle, cette condition sera définie comme "remplie" - la commande a été modifiée.


Si nous parlons de changements manuels, quelqu'un va changer quelque chose à l'insu d'EA, alors bien sûr nous devons collecter une structure de tableau et la comparer constamment aux ordres du marché.

J'avais déjà oublié... et au début je l'ai fait (heureusement que je me suis engagé), mais la façon de conditionner me semblait peu fiable, je voulais quelque chose de plus évident pour indiquer un ordre qui avait été changé.