Damn Error 130 to Hell - page 3

 
delcor wrote >>

Vangrosh

merci pour votre contribution

pouvez-vous m'aider à comprendre

Est-ce correct ?

Je fais un EA avec auto trail

if(OrderType()==OP_SELL && OrderSymbol()==Symbol())

{
si (OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red) ; // place un TP et un SL
}
if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) // placer un TP
{
if(OrderStopLoss()>(Ask+Point*TrailingStop)+Point) // vérifier si c'est vrai
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) // si vrai modifier l'ordre
Print("Error_Modify - ",GetLastError()) ;
else str=StringConcatenate("\n Mon numéro de ticket est ", OrderTicket(), " et mon réglage de stop loss est ", DoubleToStr(Ask+Point*TrailingStop,Digits)) ; // nouveau code
}
}
}

Voici ce que j'ai écrit dans un autre post, expliquant l'approche différente.

>>Voici une solution simple qui consiste à vérifier que le nouveau prix stoploss est supérieur d'au moins 1 point à l'ancien prix stoploss. Il suffit de faire l'inverse pour un ordre de vente.

      if (OrderType() == OP_BUY)
      {      
         if(Bid-OrderOpenPrice() > (Point* TrailingStop))
         {       
            double oldStopLoss = OrderStopLoss();
            double newStopLoss = Bid-Point* TrailingStop;
            double nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                       
            if( newStopLoss >= nextStopLoss) // checking that the new stoploss price is at least 1 point or greater then the old stoploss
            {                              
               OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
               return;
            }
         }
      }


Voici la fonction complète que j'utilise. Maintenant que j'y pense, j'aurais pu utiliser un meilleur nom de var que nextStopLoss, et je devrais également ajouter un contrôle d'erreur à la fonction OrderModify().

De plus, ma fonction Trailing Stop est dans un EA qui peut avoir plusieurs ordres ouverts en même temps, c'est pourquoi elle a ces paramètres afin que je puisse mettre à jour le Trailing Stop sur plusieurs ordres en même temps.

void CheckTrailingStop(int order_Ticket, int trailingStopValue)
{
   double oldStopLoss;
   double newStopLoss;
   double nextStopLoss;
   int _trailingStop = trailingStopValue;
   
   if ( order_Ticket < 0) return;
                                    
   if(OrderSelect( order_Ticket, SELECT_BY_TICKET, MODE_TRADES) == false)
   {
      Print("CheckTrailingStop() - OrderSelect returned the error of ", GetLastError());
      return;   
   }
         
   if (OrderType() == OP_BUY)
   {      
      if(Bid-OrderOpenPrice() > Point*_trailingStop)
      {       
         oldStopLoss = OrderStopLoss();
         newStopLoss = Bid-Point*_trailingStop;
         nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                    
         if( newStopLoss >= nextStopLoss)
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
                                             
   if (OrderType() == OP_SELL)
   {               
      if(OrderOpenPrice()-Ask > Point*_trailingStop)
      {
         oldStopLoss = OrderStopLoss();
         newStopLoss = Ask+Point*_trailingStop;
         nextStopLoss = oldStopLoss - Point; // Subtracting 1 point from oldStopLoss, i.e. 76.78 to 76.77
                    
         if( newStopLoss <= nextStopLoss || (OrderStopLoss() == 0))
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
}

Ensuite, dans ma fonction start(), j'ai :

void start()
{                      
   if ( validTimePeriod == false) return;
   if ( validTrailingStop == false) return;
        
   //---- Start Main program ----
   Main();
   
   if ( EnableHedging == true)
   {
      HedgeStopLossCheck();
      CheckHedges();
   }
   
   if ( TrailingStop > 0) CheckTrailingStop( currentOrderTicket, TrailingStop);               
           
   CheckWaiting();
   
   GetOpenTradeLots();   
      
   CheckIfCurrentOrder_Closed();
}

J'ai laissé les autres appels de fonction ici pour que vous puissiez voir que j'aime partitionner mon code en fonctions spécifiques autant que possible. Cela rend les choses beaucoup plus faciles.

Bonne chance avec votre EA.

 
vangrosh

Voici ce que j'ai écrit dans un autre post, expliquant l'approche différente.

>>Voici une solution facile : il suffit de vérifier que le nouveau prix stoploss est supérieur d'au moins 1 point à l'ancien prix stoploss. Il suffit de faire l'inverse pour un ordre de vente.


Voici la fonction complète que j'utilise. Maintenant que j'y pense, j'aurais pu utiliser un meilleur nom de var que nextStopLoss, et je devrais également ajouter un contrôle d'erreur à la fonction OrderModify().

De plus, ma fonction Trailing Stop est dans un EA qui peut avoir plusieurs ordres ouverts en même temps, c'est pourquoi elle a ces paramètres afin que je puisse mettre à jour le Trailing Stop sur plusieurs ordres en même temps.

Ensuite, dans ma fonction start(), j'ai :

J'ai laissé les autres appels de fonction ici pour que vous puissiez voir que j'aime partitionner mon code en fonctions spécifiques autant que possible. Cela rend les choses beaucoup plus faciles.

Bonne chance avec votre EA.

merci - ça a l'air bien

Alors, est-ce que vous placez votre fonction start() en bas de l'EA ?

 
J'ai aussi un problème avec une erreur épouvantable. Le problème, c'est que je n'ai pas de stop loss ou de take profit, il ne parvient pas à placer l'ordre en attente, à plusieurs pips du marché où il ne devrait pas y avoir de problème...
 
TheEconomist wrote >>
J'ai aussi un problème avec une erreur épouvantable. Le truc, c'est que je n'ai pas de stop loss ou de take profit, il échoue juste à placer l'ordre en attente, à plusieurs pips du marché où il ne devrait pas y avoir de problème...

Le problème avec le bon vieux 130 est qu'il indique (l'une des) une classe ou un groupe d'erreurs et ne conduit pas à une solution instantanée...
Vous pouvez même corriger un problème et il est toujours là...

La seule chose qui se produit ici est une faute de frappe ?

Peut-être que vous entrez un ordre d'achat limite au-dessus de l'Ask, alors que vous vouliez un ordre d'achat stop ?

FWIW

-BB-

 
BarrowBoy:

Le problème avec le bon vieux 130 est qu'il indique (l'une des) une classe ou un groupe d'erreurs et ne conduit pas à une solution instantanée...
Vous pouvez même corriger un problème et il est toujours là...

La seule chose qui se produit ici est une faute de frappe ?

Peut-être que vous entrez un ordre d'achat limite au-dessus de l'Ask, alors que vous vouliez un ordre d'achat stop ?

FWIW

-BB-

J'ai une fonction qui sélectionne le type d'opération :

int SellOperation(double ToCompare)
  {
   int op;
   if (Bid> ToCompare)
     op=OP_SELLSTOP;
   if (Bid== ToCompare)
     op=OP_SELL;
   if (Bid< ToCompare)
     op=OP_SELLLIMIT;        
   return( op);   
  }
  
  
int BuyOperation(double ToCompare)
  { 
   int op;
   if (Ask> ToCompare)
     op=OP_BUYLIMIT;
   if (Ask== ToCompare)
     op=OP_BUY;
   if (Ask< ToCompare)
     op=OP_BUYSTOP;
   return( op);
  }

int WhatOperation(int operation, double ToCompare)
  { 
   if ( operation==OP_BUY)
     return( BuyOperation( ToCompare));
   if ( operation==OP_SELL)
     return( SellOperation( ToCompare));     
  }       

comme ceci :

09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily : Ouverture de la vente au niveau 2 pour le pylône 0 @ 0.8024 alors que l'offre = 0.8016
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily : Erreur OrderSend 130
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily : ReliableOrderSend error : 130 : Invalid stops.


 

Bonjour TheEconomist

juste quelques petites choses...

1. Je ne vois pas de normalisation sur ToCompare, à moins que WhatOperation() soit garanti d'avoir normalisé le réel donné.

2. Les comps doubles ont des problèmes - par exemple, 'Conditional Statement failure... [At wits end] if ( 1.4225 > 1.4225) is NOT TRUE !!!!!!".

3. Suivez-vous les conseils de https://book.mql4.com/appendix/limits

Cordialement,

 

J'ai étudié ce post dans l'espoir de résoudre mon erreur dans la 'Question rapide' avec 130. La fonction d'envoi de commande est là ainsi que les écritures de journal avec la fonction d'impression, est-ce que l'un d'entre vous sait ce qui se passe ?

Merci,

Garçon Bauer

 

.

vu sur .../24681

if( isBuying ) 
{ 
  if( stopLoss > 0)
  ACCTSL = Ask - ( stopLoss*Point* MyDig);

  if( takeProfit > 0)
  ACCTTP = Ask + ( takeProfit*Point* MyDig);
  // Buy
  ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, ACCTSL, ACCTTP, 
  nameEA, 16384,0,Red); 
  Print ("Stop Loss Value", ACCTSL);
  Print ("Take Profit Value", ACCTTP);

1. StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL) ;

SL,TP doivent être au moins à des points StopLevel de l'offre.

Voir ci-dessous (**)


2. ACCTxx = NormalizeDouble(Ask ..(..), Digits) ;


3. Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits)) ;


4. Print ("Stop Loss Value",DoubleToString( ACCTSL,Digits),", stopLoss=",stopLoss) ;
Print ("Take Profit Value", DoubleToString(ACCTTP,Digits),", takeProfit=",takeProfit) ;

Pourquoi DoubleToString() ? Print() n'affiche que QUATRE CHIFFRES



Par ailleurs, j'aimerais aussi que l'on utilise au moins une fois Print("MyDig=",MyDig) ; Pourquoi ? Vous n'avez pas à vous en soucier ensuite. Cela peut sembler insignifiant, mais vous seriez étonné de l'humour qui entoure des choses aussi simples !


5. TOUS vos problèmes peuvent être facilement résolus en obtenant toutes les informations disponibles au bout de vos doigts et en les affichant.

Ensuite, avec le bon vieux papier + crayon , vous pouvez voir où sont les malentendus.



(**)

Réf : https://book.mql4.com/appendix/limits

Limitation de la distance minimale de StopLevel.

Une opération de trading ne sera pas effectuée si l'une des conditions suivantes est perturbée.

Type d'ordre Prix d'ouverture StopLoss (SL) TakeProfit (TP)
Achat
La modification est interdite Bid-SL ≥ StopLevel TP-Bid ≥ StopLevel
Vendre
La modification est interdite SL-Ask StopLevel Ask-TP StopLevel
Limite d'achat
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellLimit
OpenPrice-Bid StopLevel SL-OpenPrice ≥StopLevel OpenPrice-TP StopLevel
BuyStop
OpenPrice-Ask StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellStop
Bid-OpenPrice StopLevel SL-OpenPrice StopLevel OpenPrice-TP StopLevel

 
fbj wrote >>

.

vu sur .../24681

1. StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL) ;

SL,TP doivent être au moins à des points StopLevel de l'offre.

Voir ci-dessous (**)


2. ACCTxx = NormalizeDouble(Ask ..(..), Digits) ;


3. Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits)) ;


4. Print ("Stop Loss Value",DoubleToString( ACCTSL,Digits),", stopLoss=",stopLoss) ;
Print ("Take Profit Value", DoubleToString(ACCTTP,Digits),", takeProfit=",takeProfit) ;

Pourquoi DoubleToString() ? Print( ) n'affiche que QUATRE CHIFFRES



Par ailleurs, j'aimerais aussi que l'on utilise au moins une fois Print("MyDig=",MyDig) ; Pourquoi ? Vous n'avez pas à vous en soucier ensuite. Cela peut sembler insignifiant, mais vous seriez étonné par les plaisanteries qui entourent des choses aussi simples !


5. TOUS vos problèmes peuvent être facilement résolus en obtenant toutes les informations disponibles au bout de vos doigts et en les affichant.

Ensuite, avec le bon vieux papier + crayon , vous pouvez voir où sont les malentendus.



(**)

Réf : https://book.mql4.com/appendix/limits

Limitation de la distance minimale de StopLevel.

Une opération de trading ne sera pas effectuée si l'une des conditions suivantes est perturbée.

Type d'ordre Prix d'ouverture StopLoss (SL) TakeProfit (TP)
Achat
La modification est interdite Bid-SL ≥ StopLevel TP-Bid ≥ StopLevel
Vendre
La modification est interdite SL-Ask StopLevel Ask-TP StopLevel
Limite d'achat
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellLimit
OpenPrice-Bid StopLevel SL-OpenPrice ≥StopLevel OpenPrice-TP StopLevel
BuyStop
OpenPrice-Ask StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellStop
Bid-OpenPrice StopLevel SL-OpenPrice StopLevel Prix ouvert-TP StopLevel

Je ne peux vraiment pas dire ce qui se passe et pourquoi cela se produit.

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1 : OrderSend (Trender Beta Test ) a échoué avec l'erreur #130

05.08.2009 14:32:26 Trender Beta Test EURUSD,H1 : MyDig=10

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1 : Take Profit Value1.43155, takeProfit=110

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1 : Valeur du Stop Loss1.42255, stopLoss=200

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1 : Bid=1.44255, Ask=1.44229







 
Bauer_Boy wrote >>

Je ne peux vraiment pas dire ce qui se passe et pourquoi cela se produit.

Il est vraiment temps de montrer le code entier. Si vous hésitez, vous pouvez utiliser le PM.

Je vois que vous avez un TP plus bas alors Bid