conseiller expert - questions diverses - page 8

 

Ok, donc si vous utilisez

int stoploss=50;
double stop;

stop=stoploss*Point();

Print(DoubleToString(stoploss));

En utilisant la fonction Point(), vous devriez obtenir la valeur de votre stoploss et vous devrez ensuite l'ajouter ou la soustraire de l'offre et de la demande respectives pour obtenir le niveau de prix de votre stop.

Le même principe s'applique aux prises de bénéfices, mais bien sûr en sens inverse.

Vous pouvez vérifier certains des EA dans la base de code où il y a beaucoup d'exemples et de variations sur la façon dont les codeurs font ces choses dans leurs EA.

Par exemple, en voici un appelé Trailing Master https://www.mql5.com/en/code/16136

//-------------------------------------------------------------------------
// 1. Main function
//-------------------------------------------------------------------------
void OnTick(void)
  {
   Comment("Copyright © 2016, Il Anokhin\n"+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));

//--- 1.1. Define pip -----------------------------------------------------
   if(Digits==4 || Digits<=2) pip=Point;
   if(Digits==5 || Digits==3) pip=Point*10;

//--- 1.2. Trailing -------------------------------------------------------
   for(i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && TS>0 && OrderProfit()>0)
           {
            if(UC==true && OrderComment()==Comm && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
            if(UC==true && OrderComment()==Comm && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
            if(UC==true && OrderComment()==Comm && UM==false && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
            if(UC==true && OrderComment()==Comm && UM==false && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
            if(UC==false && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
            if(UC==false && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
            if(UC==false && UM==false && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
            if(UC==false && UM==false && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
           }
        }
     }

//--- 1.3. End of main function -------------------------------------------

Où vous pouvez voir le codeur Il Anokhin fist définit pip.

Mais voici un autre exemple appelé E-smart trailing de Димаhttps://www.mql5.com/en/code/8674.


//+------------------------------------------------------------------+

void ModifyStopLossInPoint(int stoploss)
{
bool   result;
double sl = 0;
double point = MarketInfo(OrderSymbol(),MODE_POINT);

if (OrderType() == OP_BUY) sl = OrderOpenPrice() + stoploss * point;
if (OrderType() == OP_SELL) sl = OrderOpenPrice() - stoploss * point;

result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,CLR_NONE);
if (result && UseSound) PlaySound(var_132);
}

//+------------------------------------------------------------------+

Remarquez les différences subtiles dans la façon de faire les choses.

J'essaie toujours plusieurs choses jusqu'à ce que je trouve ce qui fonctionne le mieux.

Trailing Master
Trailing Master
  • votes : 11
  • 2016.10.27
  • Il Anokhin
  • www.mql5.com
The Expert Advisor that performs order trailing after reaching certain profit.
 
Marco vd Heijden:

Ok, donc si vous utilisez...

Omg, juste un rapide check out étonnant merci pour tout avant que je commence à lire et à essayer quelque chose. Je vais essayer ça bientôt.

Encore une fois un grand merci @Marco vd Heijden

 
Marco vd Heijden:

Les objets sont empilés les uns sur les autres, il est donc important de faire savoir à chartevent () quels clics sur quel bouton ou quels objets ont la plus haute priorité par rapport aux autres objets qui pourraient se chevaucher.

Un grand merci Man, j'ai aimé tes commentaires qui sont plus clairs et plus utiles.

Bonne chance à toi.

 
Marco vd Heijden:

Ok, donc si vous utilisez

int stoploss=50;

J'essaie toujours plusieurs choses jusqu'à ce que je trouve ce qui fonctionne le mieux.

J'essaie juste de comprendre votre bon commentaire et ensuite d'écrire de bons codes pour mes ordres, mes fonctions Stop Loss et Take Profit - merci pour cela.

Donc, j'ai déjà essayé quelque chose comme le code ci-dessous, et j'ai besoin d'être sûr que les deux valeurs de Stop Loss EURUSD et FB sont correctes, pour 10 pips ? ( si vous voulez savoir ce que je pense - juste je pense que oui ci-dessous les logs / résultats les deux sont la bonne valeur pour 10 pips. )
e.g : valeur stoploss = 10 ; Position - BUY
log : EURUSD | prix (ask) : 1.05633 / Stop Loss : 1.05533
log : FB | prix (ask) : 119.69/ Stop Loss : 119.59

( J'appelle la fonction ci-dessous par void OnChartevent() )

// this part of code from OnChartEvent()
//---
if ( sparam == _buy_name_btn )
{
    ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
    _Buy_calc_SL_TP();
    
    Print( " | Click Verify /   ");
}
//---
return;
void _Buy_calc_SL_TP()
{
    //---
    if ( _StopLoss_ON == true )
    {
      //_Sl = OrderOpenPrice() - _StopLoss *  _Pip;
        _Sl = Ask - _StopLoss *  _Pip;
        Print( " | Buy Calc SL TP Function / StopLoss: ", _Sl );
    }
    //---
    return;
}
 

Ça a l'air de fonctionner.

 

J'essaierai d'inclure le commentaire de M. William en tête du code de l'EA - merci encore William.Grand calcul de Pip's MQL4
( s'il vous plaît ne me blâmez pas parce que cette industrie de code semble très large pour moi, et parfois je perds mon esprit - de toute façon j'espère que je vais terminer les codes de mon EA Trade Panel bientôt )

Et je partagerai le code de mon EA de test après l'avoir terminé pour savoir si ce code est bon / correct ou quoi (car je ne suis pas un codeur / programmeur professionnel - je travaille dessus).

 

Keith Watford:

Ok, d'accord. Je ne peux pas prendre la peine de lire certains de tes messages parce que ça me fait mal aux yeux.
Si d'autres ressentent la même chose, c'est vous qui manquez, pas moi.

Je ne connaissais pas votre nom. Je vous connais juste comme un @Gumrai, donc désolé j'étais un peu en colère contre votre commentaire. Donc vous m'avez aidé avec ce commentaire quand ma connaissance du code sous zéro. Il n'y a aucun problème à ignorer tous mes commentaires, besoin d'aide ou autre chose. Mais j'ai juste besoin de m'excuser pour ma réponse en colère à vous.
 

Le marché est fermé, et je ne suis pas sûr de rien d'autre. Mais j'ai essayé quelque chose comme le code ci-dessous, j'ai l'impression d'avoir manqué quelque chose mais je ne le trouve pas.
(Je voudrais mentionner que les EA de mon Trade Panel ont des codes pour les positions ouvertes d'achat et de vente, mais j'essaie de l'écrire avec ma main, pour être sûr du fonctionnement de cet EA).

Merci d'avance pour votre aide et vos conseils.

#define CHANGE   double      ///< Difference of two prices.
#define POINT    int         ///< `CHANGE / _Point`.
#define PIP      double      ///< `POINT / PipsPerPOINT`.
        CHANGE   points_to_change(POINT  n){ return n * _Point                         ;}
        POINT    change_to_points(CHANGE c){ return POINT(c / _Point + 0.5)            ;}
        CHANGE   pips_to_change  (PIP    n){ return points_to_change(pips_to_points(n));}
        PIP      change_to_pips  (CHANGE c){ return points_to_pips(change_to_points(c));}
        POINT    pips_to_points  (PIP    n){ if( (_Digits&1) == 1)   n *= 10.0; return POINT(n);}
        PIP      points_to_pips  (POINT  n){ PIP p = n; if( (_Digits&1) == 1) p /= 10.0; return p;}

string prfx       = "test"        ;
string sellbutton = prfx + "sell" ;
string sounduse   = "tick.wav"    ;

int    stoploss   = 10    ;
int    takeprofit = 10    ;
int    magic      = 12345 ;
int    ticket     = 0     ;
int    slippage   = 3     ;

double lot = 0.01         ;
double sl                 ;

bool   stoploss_on        = true ;
bool   result                    ;
bool   sound_use          = true ;

//---
//---
int OnInit()
{
    ObjectCreate     ( 0, sellbutton, OBJ_BUTTON        , 0, 0, 0           );
    ObjectSetString  ( 0, sellbutton, OBJPROP_TEXT      , "Sell"            );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_XDISTANCE , 20                );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_YDISTANCE , 20                );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_XSIZE     , 80                );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_YSIZE     , 40                );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_CORNER    , CORNER_LEFT_UPPER );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_COLOR     , clrWhite          );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_BGCOLOR   , clrMaroon         );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_STATE     , false             );
    ObjectSetInteger ( 0, sellbutton, OBJPROP_ZORDER    , 1                 );

    Print( "ObjectsTotal: ", ObjectsTotal() );
    return(0);
}

//---
//---
void OnTick()
{
    //---

    //---
    return;
}

//---
//---
void OnDeinit(const int reason)
{
    //---
    ObjectsDeleteAll( 0, prfx );
    //---
    return;
}

//---
//---
void OnChartEvent(const int     id     ,
                  const long&   lparam ,
                  const double& dparam ,
                  const string& sparam
                  )
{
    // Sell
    if ( sparam == sellbutton )
    {
        ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
        ticket = Orderfuntions( sellbutton );
    }
    return;
}

//---
//---
void SellCalcSLTP()
{
    //---
    if ( stoploss_on == true )
    {
        if ( OrderType() == OP_SELL ) sl = OrderOpenPrice() - pips_to_change( stoploss );
        if ( OrderType() == OP_BUY  ) sl = OrderOpenPrice() + pips_to_change( stoploss );

        result = OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, CLR_NONE );
        if ( result && sound_use ) PlaySound( sounduse );
    }
    //---
    return;
}

//---
//---
int Orderfuntions( string _Order_selector )
{
    // Sell Order
    SellCalcSLTP();
    if ( _Order_selector == sellbutton )
    {
        ticket = OrderSend( _Symbol, OP_SELL, lot, Bid, slippage, sl, takeprofit, "comment", magic, 0, clrMaroon );
    }
    return(ticket);
}
 
Cela semble correct, mais vous ne pouvez pas utiliser ordermodify comme cela, vous devez d'abord sélectionner une commande avec la fonction OrderSelect().
 
Marco vd Heijden:
Cela semble correct, mais vous ne pouvez pas utiliser ordermodify comme ça, vous devez d'abord sélectionner une commande avec la fonction OrderSelect().
Bien, je vais l'essayer bientôt. Merci !