assessor especializado - perguntas diversas - página 8

 

Está bem, então se você usar

int stoploss=50;
double stop;

stop=stoploss*Point();

Print(DoubleToString(stoploss));

Ao usar a função Point(), isto deve lhe dar o valor de sua parada e então você tem que adicioná-la ou subtraí-la de Bid e Ask respectivamente para lhe dar o nível de preço de sua parada.

O mesmo funciona para ter lucro, mas, claro, ao contrário.

Você pode verificar alguns dos EA's em base de código, há muitos exemplos e variações sobre como os codificadores fazem essas coisas em seus EA's.

Por exemplo, uma chamada 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 -------------------------------------------

Onde você pode ver o codificador Il Anokhin fist define pip.

Mas aqui está outro exemplo chamado E-smart trailing from Дима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);
}

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

Observe as diferenças sutis na hora de fazer as coisas.

Eu sempre tento várias coisas até encontrar algo que funcione melhor.

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

Muito bem, se você usar...

Omg, apenas verifique rapidamente os incríveis agradecimentos por tudo antes de começar a ler e experimentar algo. Vou tentar isso em breve.

Mais uma vez um grande obrigado @Marco vd Heijden

 
Marco vd Heijden:

Os objetos são empilhados uns sobre os outros, por isso é importante que a carta () saiba quais clicam em que botão ou objetos têm a maior prioridade sobre outros objetos que possam se sobrepor.

Muito obrigado Homem, gostei de seus comentários que são mais claros e mais úteis.

Tudo de bom para você.

 
Marco vd Heijden:

Certo, então se você usar

int stoploss=50;

Sempre tento várias coisas até encontrar algo que funcione melhor.

Estou apenas tentando entender seu bom comentário e depois escrever alguns bons códigos para minhas funções de Pedidos, Stop Loss e Take Profit - obrigado por isso.

Então, eu já tentei algo como abaixo do código, e preciso ter certeza de que tanto EURUSD quanto FB Stop Loss Value estão certos, por 10 pips? ( se você quiser saber o que estou pensando - só acho que sim abaixo dos logs / resultados ambos são o valor correto para 10 pips. )
por exemplo: valor de stoploss = 10; Posição - COMPRAR
log: EURUSD | preço (perguntar): 1.05633 / Stop Loss: 1.05533
log: FB | preço (perguntar): 119.69/ Stop Loss: 119.59

( Chamo abaixo as funções de função por meio de OnChartevent nulo() )

// 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;
}
 

Parece que está funcionando.

 

Vou tentar envolver o comentário do Sr. William ao chefe do código da EA - obrigado mais uma vez William.MQL4 do Cálculo da Great Pip
( por favor não me culpe porque esta indústria de códigos parece muito ampla para mim, e às vezes eu perco a cabeça - de qualquer forma eu espero terminar meus códigos do Painel de Comércio EA em breve )

E eu vou compartilhar o código do meu teste EA depois de terminá-lo, pois esse código é bom / certo ou não ( porque eu não sou programador / programador profissional - eu estou trabalhando nele - )

 

Keith Watford:

Ok, é justo. Não posso me incomodar em ler alguns de seus posts porque isso me machuca os olhos.
Se outros sentem o mesmo, então você perde, não eu.

Eu não conhecia seu nome. Só sei que você gosta de um @Gumrai, então desculpe por ter ficado um pouco zangado contra seu comentário. Então você me ajudou com este comentário quando meu conhecimento de código abaixo de zero. Não há problema algum em ignorar todos os meus comentários, precisar de ajuda ou qualquer outra coisa. Mas eu só preciso me desculpar por minha resposta zangada a você.
 

O mercado está fechado, e não tenho certeza de mais nada. Mas eu tentei algo como abaixo do código, sinto que perdi algo, mas não consigo encontrá-lo.
( Gostaria de mencionar que meus EA's do Painel de Comércio têm códigos de Open Buy, e posições de Open Sell, mas estou tentando escrevê-lo com minha mão, que tenho certeza de como este EA's funciona )

Obrigado antecipadamente por sua ajuda e conselho.

#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);
}
 
Parece bem, mas você não pode usar ordermodificar assim, primeiro você tem que selecionar um pedido com a função OrderSelect().
 
Marco vd Heijden:
Parece bem, mas você não pode usar ordermodificar assim, primeiro você tem que selecionar um pedido com a função OrderSelect().
Ótimo, vou tentar em breve. Obrigado!