советник - разные вопросы - страница 8

 

Итак, если вы используете

int stoploss=50;
double stop;

stop=stoploss*Point();

Print(DoubleToString(stoploss));

Используя функцию Point(), вы получите значение стоплосса, а затем вам нужно будет либо прибавить, либо вычесть его из Bid и Ask, чтобы получить уровень цены вашего стопа.

То же самое работает и для тейк-профита, но, конечно, в обратном порядке.

Вы можете проверить некоторые советники в базе кода, там есть много примеров и вариаций того, как кодеры делают эти вещи в своих советниках.

Например, вот один под названием 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 -------------------------------------------

Где вы можете увидеть, как кодер Иль Анохин кулаком определяет пункт.

А вот другой пример под названием E-smart trailing от Дима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);
}

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

Обратите внимание на тонкие различия в работе.

Я всегда пробую разные вещи, пока не найду то, что работает лучше всего.

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

Итак, если вы используете...

Омг, просто быстро проверить удивительно спасибо за все, прежде чем я начал читать и попробовать что-то. Я попробую это в ближайшее время.

Еще раз огромное спасибо @Marco vd Heijden

 
Marco vd Heijden:

Объекты располагаются друг на друге, поэтому важно, чтобы chartevent () знал, какие нажатия на какую кнопку или объекты имеют наивысший приоритет над другими объектами, которые могут перекрываться.

Огромная благодарность Человек, мне понравились ваши комментарии, которые более ясны и более полезны.

Всего вам наилучшего.

 
Marco vd Heijden:

Итак, если вы используете

int stoploss=50;

Я всегда пробую разные вещи, пока не найду то, что работает лучше всего.

Я просто пытаюсь понять ваш хороший комментарий и затем написать несколько хороших кодов для моих функций ордеров, стоп-лосса и тейк-профита - спасибо за это.

Итак, я уже попробовал что-то вроде приведенного ниже кода, и мне нужно убедиться, что значение стоп-лосса по EURUSD и FB правильно, на 10 пунктов? (Если вы хотите знать, о чем я думаю - просто я думаю, что да, нижеприведенные логи / результаты оба являются правильным значением для 10 пунктов. )
например: значение стоплосса = 10; Позиция - ПОКУПКА
log: EURUSD | цена (ask): 1.05633 / Stop Loss: 1.05533
лог: FB | цена (запрос): 119.69/ стоп-лосс: 119.59

(Я вызываю нижеприведенную функцию с помощью 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;
}
 

Кажется, работает.

 

Я постараюсь учесть комментарий г-на Уильяма в коде советника - еще раз спасибо, Уильям.Отличный расчет пипсовки MQL4
(пожалуйста, не вините меня, потому что эта отрасль кода выглядит очень широко для меня, и иногда я теряю голову - в любом случае, я надеюсь, что я скоро закончу коды моего советника Trade Panel)

И я поделюсь кодом моего тестового советника после того, как закончу его, чтобы узнать, хорош ли этот код / правилен или как? (потому что я не профессиональный кодер / программист - я работаю над этим).

 

Keith Watford:

Ладно, справедливо. Я не могу потрудиться прочитать некоторые из ваших сообщений, потому что это вредит моим глазам.
Если другие чувствуют то же самое, тогда вы пропускаете, а не я.

Я не знал вашего имени. Я просто знаю вас как @Gumrai, так что извините, что я был немного зол на ваш комментарий. Так что вы помогли мне с этим комментарием, когда мои знания кода на нуле. Нет никаких проблем игнорировать все мои комментарии, нужна помощь или что-то еще. Но мне просто нужно извиниться за мой гневный ответ вам.
 

Рынок закрыт, и я больше ни в чем не уверен. Но я пробовал что-то вроде нижеприведенного кода, я чувствую, что что-то упустил, но не могу найти.
(Я хотел бы отметить, что у моего советника Trade Panel есть код для открытых позиций на покупку и продажу, но я пытаюсь написать его от руки, чтобы быть уверенным в том, как работает этот советник).

Заранее спасибо за помощь и совет.

#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);
}
 
Это выглядит нормально, но вы не можете использовать ordermodify таким образом, вы должны сначала выбрать заказ с помощью функции OrderSelect().
 
Marco vd Heijden:
Это выглядит нормально, но вы не можете использовать ordermodify таким образом, вы должны сначала выбрать заказ с помощью функции OrderSelect().
Хорошо, я попробую это в ближайшее время. Спасибо!
Причина обращения: