Спасибо! Не знал, что в MQL для этого есть функция. Уже хотел создавать свою. Но перед этим решил спросить на форуме.
Это следствие неправильного подхода к изучению языка. Если-бы вы работали с документацией, а не с г.кодами из……… читая справку по ресурсам, вы точно прочли-бы об этом. И не надо было-бы спрашивать.
Я сделал это, чтобы при трейлинге до купался контракт, так как Take Profit равен 500, а Stop Loss равен 150.
Покупается до пяти дополнительных контрактов.
Можно ли запретить открытие новых позиций, когда две уже открыты? Ограничить объем открытых позиций.
//--------------------------------------------------------------------void OPENORDER(string ord)
{
double priceL=m_symbol.Ask();
if(ord=="Sell")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,""))
Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of Retcode: ",m_trade.ResultRetcodeDescription(),
", ticket of order: ",m_trade.ResultOrder()); // Если sell, то не открываемсяdouble priceS=m_symbol.Bid();
if(ord=="Buy")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,""))
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription(),
", ticket of deal: ",m_trade.ResultDeal());
return;
}
double iMAGet(constint handle,constint index)
{
double MA[];
ArraySetAsSeries(MA,true);
//--- reset error codeResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 indexif(CopyBuffer(handle,0,0,index+1,MA)<0)
{
//--- if the copying fails, tell the error codePrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(0.0);
}
return(MA[index]);
}
//+------------------------------------------------------------------+//| Refreshes the symbol quotes data |//+------------------------------------------------------------------+bool RefreshRates()
{
//--- refresh ratesif(!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);
}
//+------------------------------------------------------------------+//| Get Time for specified bar index |//+------------------------------------------------------------------+datetimeiTime(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
{
if(symbol==NULL)
symbol=Symbol();
if(timeframe==0)
timeframe=Period();
datetime Time[];
datetime time=0;
ArraySetAsSeries(Time,true);
int copied=CopyTime(symbol,timeframe,index,1,Time);
if(copied>0)
time=Time[0];
return(time);
}
//+------------------------------------------------------------------+//| Get value of buffers |//+------------------------------------------------------------------+bool iGetArray(constint handle,constint buffer,constint start_pos,
constint count,double &arr_buffer[])
{
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
return(false);
}
ArrayFree(arr_buffer);
//--- reset error codeResetLastError();
//--- fill a part of the iBands array with values from the indicator bufferint copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
//--- if the copying fails, tell the error codePrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
__FILE__,__FUNCTION__,count,copied,GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(false);
}
return(result);
}
void TrailingOrder()
{
if(InpTrailingOrderLimit==0)
return;
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positionsif(m_position.SelectByIndex(i))
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Buy");
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Sell");
}
}
}
}
void Trailing()
{
if(InpTStop==0)
return;
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
}
}
Alexey Viktorov: Это следствие неправильного подхода к изучению языка. Если-бы вы работали с документацией, а не с г.кодами из……… читая справку по ресурсам, вы точно прочли-бы об этом. И не надо было-бы спрашивать.
Я как знал, что после моего ответа начнутся нравоучения... В своём репертуаре... Я же вроде сказал: "Спасибо", но нет... Нужно обязательно написать что-нибудь эдакое... Знали функцию из документации - молодец! Но если кодом как следует не владеть, то хоть изучите вы вдоль и поперек документацию MQL, всё равно, на практике польза будет минимальной!...
Здравствуйте.
Подскажите, есть ли возможность в параметрах советника добавить колонку с комментариями или пояснениями... ???
Спасибо.
да, но нужен исходник
Спасибо! Не знал, что в MQL для этого есть функция. Уже хотел создавать свою. Но перед этим решил спросить на форуме.
Здравствуйте.
Подскажите, есть ли возможность в параметрах советника добавить колонку с комментариями или пояснениями... ???
Спасибо.
Когда-же вы научитесь читать документацию?
Это следствие неправильного подхода к изучению языка. Если-бы вы работали с документацией, а не с г.кодами из……… читая справку по ресурсам, вы точно прочли-бы об этом. И не надо было-бы спрашивать.
Я как знал, что после моего ответа начнутся нравоучения... В своём репертуаре... Я же вроде сказал: "Спасибо", но нет... Нужно обязательно написать что-нибудь эдакое... Знали функцию из документации - молодец! Но если кодом как следует не владеть, то хоть изучите вы вдоль и поперек документацию MQL, всё равно, на практике польза будет минимальной!...
Случайно наткнулся на такой баг
создаем две одинаковых кнопки с небольшой разницей координат
выглядит это так
в итоге только первая кнопка реагирует на OnChartEvent, вторая никак.
Я сделал это, чтобы при трейлинге до купался контракт, так как Take Profit равен 500, а Stop Loss равен 150.
я не знаю MQL5, но думаю
Случайно наткнулся на такой баг
создаем две одинаковых кнопки с небольшой разницей координат
выглядит это так
в итоге только первая кнопка реагирует на OnChartEvent, вторая никак.
А код в обработчике можно посмотреть?
И почему там в параметрах -73, не очень понятно?...
А код в обработчике можно посмотреть?
И почему там в параметрах -73, не очень понятно?...
Ошибок никаких не выдает.
С такими координатами кнопка выходит перевернутой, т.к. длина кнопки считается +/- от точки Х