Grazie! Non sapevo che MQL avesse una funzione per questo. Stavo per creare il mio. Ma prima ho deciso dichiedere sul forum.
Questa è una conseguenza dell'approccio sbagliato all'apprendimento delle lingue. Se aveste lavorato con la documentazione, non con il g.code di......... leggendo l'aiuto delle risorse, avreste letto di questo. E non c'è bisogno di chiedere.
Ho fatto in modo che quando sono in trailing di un contratto, il Take Profitè uguale a 500 e lo Stop Loss è uguale a 150.
Si acquistano fino a cinque contratti aggiuntivi.
Posso proibire l'apertura di nuove posizioni quando due sono già aperte? Limitare il volume delle posizioni aperte.
//--------------------------------------------------------------------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: Questa è una conseguenza dell'approccio sbagliato allo studio della lingua. Se lavoraste con la documentazione, piuttosto che con la codifica da ......... leggendo l'aiuto sulle risorse, lo leggereste. E non c'è bisogno di chiedere.
Sapevo che la mia risposta sarebbe stata seguita da una lezione... Sai, come fai tu... Credevo di aver detto: "Grazie", ma no... Devi scrivere qualcosa... Se conoscete la funzione dalla documentazione, buon per voi! Ma se non si conosce bene il codice, si può studiare la documentazione MQL in lungo e in largo, ma sarà molto poco utile nella pratica...!
Salve.
Potete dirmi se è possibile aggiungere una colonna con commenti o spiegazioni nei parametri EA... ???
Grazie.
Sì, ma hai bisogno della fonte.
Grazie! Non sapevo che MQL avesse una funzione per questo. Stavo per creare il mio. Ma prima ho deciso dichiedere sul forum.
Salve.
Potete dirmi se è possibile aggiungere una colonna con commenti o spiegazioni nei parametri EA... ???
Grazie.
Quando imparerete a leggere la documentazione?
Questa è una conseguenza dell'approccio sbagliato allo studio della lingua. Se lavoraste con la documentazione, piuttosto che con la codifica da ......... leggendo l'aiuto sulle risorse, lo leggereste. E non c'è bisogno di chiedere.
Sapevo che la mia risposta sarebbe stata seguita da una lezione... Sai, come fai tu... Credevo di aver detto: "Grazie", ma no... Devi scrivere qualcosa... Se conoscete la funzione dalla documentazione, buon per voi! Ma se non si conosce bene il codice, si può studiare la documentazione MQL in lungo e in largo, ma sarà molto poco utile nella pratica...!
Mi sono accidentalmente imbattuto in questo bug
Creare due pulsanti identici con coordinate leggermente diverse
sembra così
Ma come risultato, solo il primo pulsante reagisce a OnChartEvent, il secondo no.
L 'ho fatto così quando traino un contratto, perché Take Profitè uguale a 500 e Stop Loss è uguale a 150.
Non conosco MQL5, ma penso che
Mi sono accidentalmente imbattuto in questo bug
Creare due pulsanti identici con coordinate leggermente diverse
sembra così
ma come risultato, solo il primo pulsante reagisce a OnChartEvent, il secondo no.
Puoi vedere il codice nel gestore?
E perché c'è -73 nei parametri, non è molto chiaro...?
Posso vedere il codice nel gestore?
E perché c'è -73 nei parametri, non è molto chiaro...?
Non dà nessun errore.
Con queste coordinate il pulsante è capovolto, perché la lunghezza del pulsante è calcolata +/- dal punto X