consulente esperto - domande varie - pagina 8

 

Ok, quindi se usi

int stoploss=50;
double stop;

stop=stoploss*Point();

Print(DoubleToString(stoploss));

Usando la funzione Point() questo dovrebbe ottenere il vostro valore di stoploss e poi dovete aggiungerlo o sottrarlo rispettivamente da Bid e Ask per darvi il livello di prezzo del vostro stop.

Lo stesso funziona per il take profit, ma ovviamente al contrario.

Puoi controllare alcuni EA in code base, ci sono molti esempi e variazioni su come i codificatori fanno queste cose nei loro EA.

Per esempio questo si chiama 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 -------------------------------------------

Dove potete vedere il coder Il Anokhin pugno definisce pip.

Ma ecco un altro esempio chiamato E-smart trailing da Дима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);
}

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

Notate le sottili differenze nel fare le cose.

Provo sempre varie cose finché non trovo qualcosa che funziona meglio.

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

Ok, quindi se usi...

Omg, solo un rapido controllo incredibile grazie per tutto prima di iniziare a leggere e provare qualcosa. Lo proverò presto.

Ancora una volta enorme grazie @Marco vd Heijden

 
Marco vd Heijden:

Gli oggetti sono impilati l'uno sull'altro, quindi è importante far sapere a chartevent () quali clic su quale pulsante o oggetti hanno la massima priorità rispetto ad altri oggetti che potrebbero sovrapporsi.

Enorme grazie Uomo, mi è piaciuto il tuo commento che uno che sono più chiaramente e più utile.

Tutto il meglio per te.

 
Marco vd Heijden:

Ok, quindi se usi

int stoploss=50;

Provo sempre varie cose finché non trovo qualcosa che funziona meglio.

Sto solo cercando di capire il tuo buon commento e poi scrivere qualche buon codice per i miei ordini, funzioni Stop Loss e Take Profit - grazie per questo.

Allora, ho già provato qualcosa come il seguente codice, e ho bisogno di essere sicuro che sia EURUSD che FB abbiano un valore di Stop Loss giusto, per 10 pips? ( se vuoi sapere cosa sto pensando - penso solo che sì, sotto i registri / risultati sono entrambi il giusto valore per 10 pips. )
es: valore di stoploss = 10; Posizione - COMPRA
log: EURUSD | prezzo (ask): 1.05633 / Stop Loss: 1.05533
log: FB | prezzo (ask): 119.69/ Stop Loss: 119.59

( Chiamo la funzione sottostante con 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;
}
 

Sembra funzionare.

 

Cercherò di coinvolgere il commento del signor William a capo del codice EA - grazie ancora una volta William.Grande calcolo di Pip MQL4
(per favore non biasimatemi perché questo settore del codice sembra molto ampio per me, e a volte perdo la testa - in ogni caso spero di finire presto i codici del mio EA Trade Panel)

E condividerò il mio codice di test EA dopo averlo finito per sapere se il codice è buono / giusto o cosa? (perché non sono un codificatore / programmatore professionista - ci sto lavorando - )

 

Keith Watford:

Ok, mi sembra giusto. Non posso essere disturbato a leggere alcuni dei tuoi post perché mi fanno male gli occhi.
Se altri si sentono allo stesso modo, allora siete voi a perdervi, non io.

Non conoscevo il tuo nome. So solo che ti piace un @Gumrai, quindi scusa se ero un po' arrabbiato contro il tuo commento. Così mi hai aiutato con questo commento quando la mia conoscenza del codice sotto zero. Non c'è nessun problema ignorare tutti i miei commenti, ha bisogno di aiuto o qualcos'altro. Ma ho solo bisogno di scusa per la mia risposta arrabbiata a voi.
 

Il mercato è chiuso e non sono sicuro di nient'altro. Ma ho provato qualcosa come il codice qui sotto, sento di aver perso qualcosa ma non riesco a trovarlo.
(Vorrei menzionare che il mio pannello di trading EA ha un codice per aprire posizioni di acquisto e di vendita, ma sto cercando di scriverlo a mano, che sono sicuro di come funziona questo EA)

Grazie in anticipo per il vostro aiuto e consiglio.

#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);
}
 
Sembra ok, ma non puoi usare ordermodify così, devi prima selezionare un ordine con la funzione OrderSelect().
 
Marco vd Heijden:
Sembra ok, ma non puoi usare ordermodify così, devi prima selezionare un ordine con la funzione OrderSelect().
Bello, lo proverò presto. Grazie!