1. Читаем справку Торговые функции-OrderSend, там куча примеров
2. По какой цене? Инструмента или депозита?
1. Читаем справку Торговые функции-OrderSend, там куча примеров
2. По какой цене? Инструмента или депозита?
Trade panel with autopilot на мт5. И мне надо добавить в него тейк профит и стоп лосс по другому так как в нём нет такой функции.
Я хочу сделать скальперского робота. Я только начинаю этим заниматься и торговал в ручную и на основе своих торгов хочу сделать робота. За основу я беру этого робота
Trade panel with autopilot на мт5. И мне надо добавить в него тейк профит и стоп лосс по другому так как в нём нет такой функции.
1. Читаем справку Торговые функции-OrderSend, там куча примеров
Жаль шрифт больше не делается
Подскажите что нужно прописать в роботе что-бы он выставлял стоп лосс и тейк профит.
Заранее большое спасибо
Вот пример выставления Stop Loss и Take Profit (пример работает только на hedge счетах):
//| Stop Loss Take Profit.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
//--- input parameters
input ushort InpStopLoss = 30; // Stop Loss (in pips)
input ushort InpTakeProfit = 90; // Take Profit (in pips)
//---
double ExtStopLoss;
double ExtTakeProfit;
bool FirstStart;
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetMarginMode();
if(!IsHedging())
{
Print("Hedging only!");
return(INIT_FAILED);
}
m_symbol.Name(Symbol()); // sets symbol name
m_symbol.Refresh(); // refreshes the symbol data
if(!RefreshRates())
{
Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
return(INIT_FAILED);
}
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
ExtStopLoss = InpStopLoss * digits_adjust * m_symbol.Point();
ExtTakeProfit = InpTakeProfit * digits_adjust * m_symbol.Point();
FirstStart=true;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(FirstStart)
{
if(!RefreshRates())
return;
m_trade.Buy(m_symbol.LotsMin(),Symbol(),m_symbol.Ask(),
m_symbol.Bid()-ExtStopLoss,
m_symbol.Ask()+ExtTakeProfit);
m_trade.Sell(m_symbol.LotsMin(),Symbol(),m_symbol.Bid(),
m_symbol.Ask()+ExtStopLoss,
m_symbol.Bid()-ExtTakeProfit);
FirstStart=false;
}
}
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data |
//+------------------------------------------------------------------+
bool RefreshRates()
{
//--- refresh rates
if(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"
if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetMarginMode(void)
{
m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool IsHedging(void)
{
return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
}
//+------------------------------------------------------------------+
Вот пример выставления Stop Loss и Take Profit (пример работает только на hedge счетах):
//| Stop Loss Take Profit.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
//--- input parameters
input ushort InpStopLoss = 30; // Stop Loss (in pips)
input ushort InpTakeProfit = 90; // Take Profit (in pips)
//---
double ExtStopLoss;
double ExtTakeProfit;
bool FirstStart;
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetMarginMode();
if(!IsHedging())
{
Print("Hedging only!");
return(INIT_FAILED);
}
m_symbol.Name(Symbol()); // sets symbol name
m_symbol.Refresh(); // refreshes the symbol data
if(!RefreshRates())
{
Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
return(INIT_FAILED);
}
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
ExtStopLoss = InpStopLoss * digits_adjust * m_symbol.Point();
ExtTakeProfit = InpTakeProfit * digits_adjust * m_symbol.Point();
FirstStart=true;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(FirstStart)
{
if(!RefreshRates())
return;
m_trade.Buy(m_symbol.LotsMin(),Symbol(),m_symbol.Ask(),
m_symbol.Bid()-ExtStopLoss,
m_symbol.Ask()+ExtTakeProfit);
m_trade.Sell(m_symbol.LotsMin(),Symbol(),m_symbol.Bid(),
m_symbol.Ask()+ExtStopLoss,
m_symbol.Bid()-ExtTakeProfit);
FirstStart=false;
}
}
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data |
//+------------------------------------------------------------------+
bool RefreshRates()
{
//--- refresh rates
if(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"
if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetMarginMode(void)
{
m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool IsHedging(void)
{
return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
}
//+------------------------------------------------------------------+
Владимир, чисто из любопытства, это ты специально такие развернутые ответы пишешь ли заготовлены типовые болванки? Если болванки, может, организовать ветку Code Snippets? Думаю, каждый MQL5 программист туда свой кусочек кинет. Ведь в Code Base сниппеты не положишь, там должно быть нечто цельное и работающее.
Сейчас у MS в Visual Studio даже в контекстном меню редактора есть пункт "Insert Snippet", можно типовые использовать или свою библиотеку создать. А у нас была бы ветка на форуме.
Сейчас даже голосование сделаю по этому вопросу )
Владимир, чисто из любопытства, это ты специально такие развернутые ответы пишешь ли заготовлены типовые болванки? Если болванки, может, организовать ветку Code Snippets? Думаю, каждый MQL5 программист туда свой кусочек кинет. Ведь в Code Base сниппеты не положишь, там должно быть нечто цельное и работающее.
Сейчас у MS в Visual Studio даже в контекстном меню редактора есть пункт "Insert Snippet", можно типовые использовать или свою библиотеку создать. А у нас была бы ветка на форуме.
Сейчас даже голосование сделаю по этому вопросу )
можно и я свой "простой" для понимания код вставлю /
Работает на любом счете
в внешних переменных
input int TakeProfits=0;
функции
//+----------------------------------------------------------------------------+
//| Описание : Вычисляет новый Стоплосс тейкпрофит и выставляет. |
//+----------------------------------------------------------------------------+
void Modify(string symToWork2,int sl2,int tp2,int tickettoModify=0,int tickettoModifydeal=0)
{
ZeroMemory(request);
ZeroMemory(result);
int PosTotal=PositionsTotal();
for(int i=PosTotal-1;i>=0;i--)
{
if((PositionSelectByTicket(PositionGetTicket(i))==true || (!PositionSelectByTicket(PositionGetTicket(i)) && PositionSelect(symToWork2)))
&& (tickettoModify==0 || tickettoModify==PositionGetTicket(i) || AccountInfoInteger(ACCOUNT_MARGIN_MODE)!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
)
{
stop_level=SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_TRADE_STOPS_LEVEL);
if((PositionGetString(POSITION_SYMBOL)!=symToWork2)) continue;
order_open_price = PositionGetDouble(POSITION_PRICE_OPEN);
order_type = PositionGetInteger(POSITION_TYPE);
if(order_type==POSITION_TYPE_BUY)
{
double sl,tp;
if(sl2!=0 ) sl=SymbolInfoDouble(symToWork2,SYMBOL_BID)-sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
if(tp2!=0 ) tp=SymbolInfoDouble(symToWork2,SYMBOL_BID)+tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;
ModifyOrders(PositionGetInteger(POSITION_IDENTIFIER),sl,tp,"Modify");
}// end POSITION_TYPE_BUY
else if(order_type==POSITION_TYPE_SELL)
{
double sl,tp;
if(sl2!=0) sl=SymbolInfoDouble(symToWork2,SYMBOL_ASK)+sl2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else sl=0;
if(tp2!=0) tp=SymbolInfoDouble(symToWork2,SYMBOL_ASK)-tp2*SymbolInfoDouble(symToWork2,SYMBOL_POINT); else tp=0;
ModifyOrders(PositionGetInteger(POSITION_IDENTIFIER),sl,tp,"Modify");
}// end POSITION_TYPE_SELL
}// end if select
}
}// end for
//+------------------------------------------------------------------+
//| Модификация позиций |
//+------------------------------------------------------------------+
bool ModifyOrders(int ticket,double stoploss,double takeprofit,string comenttomodify)
{
ZeroMemory(request);
ZeroMemory(result);
request.symbol=PositionGetString(POSITION_SYMBOL);
int stops_level=(int)SymbolInfoInteger(request.symbol,SYMBOL_TRADE_STOPS_LEVEL);
bool SL_check=false,TP_check=false;
if(stops_level==0){SL_check=true;TP_check=true;}
request.position=ticket;
request.order=PositionGetInteger(POSITION_IDENTIFIER);
request.comment=comenttomodify;
if(stoploss==-1)stoploss=PositionGetDouble(POSITION_SL);
if(takeprofit==-1)takeprofit=PositionGetDouble(POSITION_TP);
if(stoploss!=PositionGetDouble(POSITION_SL))request.sl=stoploss;else request.sl=PositionGetDouble(POSITION_SL);
if(takeprofit!=PositionGetDouble(POSITION_TP))request.tp=takeprofit;else request.tp=PositionGetDouble(POSITION_TP);
request.tp=NormalizeDouble(request.tp,SymbolInfoInteger(symToWork,SYMBOL_DIGITS));
request.sl=NormalizeDouble(request.sl,SymbolInfoInteger(symToWork,SYMBOL_DIGITS));
request.action=TRADE_ACTION_SLTP;
request.deviation=slippage; // по спреду
if(NormalizeDouble(request.sl,SymbolInfoInteger(request.symbol,SYMBOL_DIGITS))==NormalizeDouble(PositionGetDouble(POSITION_SL),SymbolInfoInteger(request.symbol,SYMBOL_DIGITS))
&& NormalizeDouble(request.tp,SymbolInfoInteger(request.symbol,SYMBOL_DIGITS))==NormalizeDouble(PositionGetDouble(POSITION_TP),SymbolInfoInteger(request.symbol,SYMBOL_DIGITS)))
{
return(false);
}
//--- получим уровень SYMBOL_TRADE_STOPS_LEVEL
//--- проверяем только два типа ордеров
switch(PositionGetInteger(POSITION_TYPE))
{
//--- операция покупка
case ORDER_TYPE_BUY:
{
//--- проверим StopLoss
if(request.sl!=0)SL_check=(SymbolInfoDouble(request.symbol,SYMBOL_BID)-request.sl>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else SL_check=true;
if(!SL_check && request.sl!=0)
PrintFormat("CHECKSLTP ERROR "+comenttomodify+" For order %d StopLoss=%.5f must be less than %.5f"+
" (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
ticket,request.sl,SymbolInfoDouble(request.symbol,SYMBOL_BID)-stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_BID),stops_level);
//--- проверим TakeProfit
if(request.tp!=0)TP_check=(request.tp-SymbolInfoDouble(request.symbol,SYMBOL_BID)>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else TP_check=true;
if(!TP_check && request.tp!=0)
PrintFormat("CHECKSLTP ERROR "+comenttomodify+" For order %d TakeProfit=%.5f must be greater than %.5f"+
" (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
ticket,request.tp,SymbolInfoDouble(request.symbol,SYMBOL_BID)+stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_BID),stops_level);
break; //--- вернем результат проверки
}
//--- операция продажа
case ORDER_TYPE_SELL:
{
//--- проверим StopLoss
if(request.sl!=0)SL_check=(request.sl-SymbolInfoDouble(request.symbol,SYMBOL_ASK)>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else SL_check=true;
if(!SL_check && request.sl!=0)
PrintFormat("CHECKSLTP ERROR "+comenttomodify+" For order %d StopLoss=%.5f must be greater than %.5f "+
" (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
ticket,request.sl,SymbolInfoDouble(request.symbol,SYMBOL_ASK)+stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_ASK),stops_level);
//--- проверим TakeProfit
if(request.tp!=0)TP_check=(SymbolInfoDouble(request.symbol,SYMBOL_ASK)-request.tp>stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT));else TP_check=true;
if(!TP_check && request.tp!=0)
PrintFormat("CHECKSLTP ERROR "+comenttomodify+" For order %d TakeProfit=%.5f must be less than %.5f "+
" (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
ticket,request.tp,SymbolInfoDouble(request.symbol,SYMBOL_ASK)-stops_level*SymbolInfoDouble(request.symbol,SYMBOL_POINT),SymbolInfoDouble(request.symbol,SYMBOL_ASK),stops_level);
break;
}
}
if(TP_check && SL_check)
{
Print("ModifyOrders "+comenttomodify+" "
+ticket
+" POSITION_TYPE="+PositionGetInteger(POSITION_TYPE)
+" stoploss="+stoploss
+" takeprofit="+takeprofit
+" request.sl="+request.sl
+" request.tp="+request.tp
+" POSITION_SL="+PositionGetDouble(POSITION_SL)
+" POSITION_TP="+PositionGetDouble(POSITION_TP)
+" SYMBOL_BID="+SymbolInfoDouble(request.symbol,SYMBOL_BID)
+" SYMBOL_ASK="+SymbolInfoDouble(request.symbol,SYMBOL_ASK)
+" stops_level="+stops_level
);
bool checksend=OrderSend(request,result);
}
if(result.retcode==TRADE_RETCODE_DONE)
{
if(Sounds)PlaySound("ok.wav"); Print("ModifyOrders "+comenttomodify+" = "+(string)result.retcode+
" symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
+(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+" "+ErrorDescription(result.retcode));
}
else
{
if(Sounds)PlaySound("stops.wav");
Print("ModifyOrders "+comenttomodify+" ERROR = "+(string)result.retcode+
" symbol "+(string)request.symbol+" volume "+(string)request.volume+" action "+(string)request.action+" tp "+(string)request.tp+" sl "
+(string)request.sl+" type "+(string)request.type+" price "+(string)request.price+" "+ErrorDescription(result.retcode));
}
return(false);
}
в OnTick там где нужна модификация:
// Модификация позиций
//+------------------------------------------------------------------+
Modify(Symbol(),StopLosss,TakeProfits);
... и обязательно сразу в первых строках, объяснение для нетямущих - что есть "сниппет" 😉
Написал, даже простейший пример из студии привел ) Вопрос такой, технически сколько я (если буду вести ветку сниппетов) смогу редактировать свой первый пост? Вроде есть какой-то срок у движка форума? Надо же меню будет делать и в него дбавлять новые пункты
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите что нужно прописать в роботе что-бы он выставлял стоп лосс и тейк профит.
Заранее большое спасибо