Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Итак, если вы используете
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);
}
//+------------------------------------------------------------------+
Обратите внимание на тонкие различия в работе.
Я всегда пробую разные вещи, пока не найду то, что работает лучше всего.
Итак, если вы используете...
Омг, просто быстро проверить удивительно спасибо за все, прежде чем я начал читать и попробовать что-то. Я попробую это в ближайшее время.
Еще раз огромное спасибо @Marco vd Heijden
Объекты располагаются друг на друге, поэтому важно, чтобы chartevent () знал, какие нажатия на какую кнопку или объекты имеют наивысший приоритет над другими объектами, которые могут перекрываться.
Огромная благодарность Человек, мне понравились ваши комментарии, которые более ясны и более полезны.
Всего вам наилучшего.
Итак, если вы используете
Я всегда пробую разные вещи, пока не найду то, что работает лучше всего.
Я просто пытаюсь понять ваш хороший комментарий и затем написать несколько хороших кодов для моих функций ордеров, стоп-лосса и тейк-профита - спасибо за это.
Итак, я уже попробовал что-то вроде приведенного ниже кода, и мне нужно убедиться, что значение стоп-лосса по EURUSD и FB правильно, на 10 пунктов? (Если вы хотите знать, о чем я думаю - просто я думаю, что да, нижеприведенные логи / результаты оба являются правильным значением для 10 пунктов. )
например: значение стоплосса = 10; Позиция - ПОКУПКА
log: EURUSD | цена (ask): 1.05633 / Stop Loss: 1.05533
лог: FB | цена (запрос): 119.69/ стоп-лосс: 119.59
(Я вызываю нижеприведенную функцию с помощью void OnChartevent()).
//---
if ( sparam == _buy_name_btn )
{
ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
_Buy_calc_SL_TP();
Print( " | Click Verify / ");
}
//---
return;
{
//---
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:
Ладно, справедливо. Я не могу потрудиться прочитать некоторые из ваших сообщений, потому что это вредит моим глазам.
Если другие чувствуют то же самое, тогда вы пропускаете, а не я.
Рынок закрыт, и я больше ни в чем не уверен. Но я пробовал что-то вроде нижеприведенного кода, я чувствую, что что-то упустил, но не могу найти.
(Я хотел бы отметить, что у моего советника Trade Panel есть код для открытых позиций на покупку и продажу, но я пытаюсь написать его от руки, чтобы быть уверенным в том, как работает этот советник).
Заранее спасибо за помощь и совет.
#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().