Evidenziato...se <0, allora il lotto del trade perdente è aumentato
se >0, allora il lotto di un'operazione in profitto è aumentato
Ciao.
Ho un'altra domanda sul tuo EA
quando l'ho provato su un conto demo, è successo quanto segue:
Quando l'EA raggiunge i parametri specificati, è passato alla modalità "stop", cioè, il pulsante "start" è acceso, ma il trading non si è fermato e gli scambi sono molto brevi, letteralmente uno o due centesimi. È così che dovrebbe essere?
Ho anche scoperto che l'EA ha chiuso alcune operazioni non al prezzo di take o stop e non al limite di denaro, ma "per niente" e il prezzo ha superato varie quantità di punti prima di essere chiuso. Allo stesso tempo, l'Expert Advisor copre completamente le perdite precedenti, di un paio di centesimi, (per esempio, tre affari di fila hanno (-15,59 $) un affare redditizio = +15,62 $ e lo ha chiuso immediatamente!)
ha guardato i log, nessun errore da nessuna parte...
quando l'ho provato su una demo, è successo quanto segue:
Quando l'EA raggiunge i parametri preimpostati, passa alla modalità "stop", cioè il pulsante "start" è acceso, ma il trading non viene fermato, ma vengono aperti trade molto brevi, solo uno o due centesimi. È così che dovrebbe essere?
Ho anche scoperto che l'EA ha chiuso alcune operazioni non al prezzo di take o stop e non al limite di denaro, ma "per niente" e il prezzo ha superato varie quantità di punti prima di essere chiuso. Allo stesso tempo, l'Expert Advisor copre completamente le perdite precedenti, di un paio di centesimi, (per esempio, tre affari di fila hanno (-15,59 $) un affare redditizio = +15,62 $ e lo ha chiuso immediatamente!)
ha guardato i log, nessun errore da nessuna parte...
Per favore, inviateci il codice con le vostre correzioni. Vedremo.
Per favore consigliatemi quale funzione e dove aggiungere a questo semplice EA,
Oltre ai modi esistenti per resettare molto a quello iniziale,
Se volete chiudere la posizione corrente quando viene raggiunto un drawdown della posizione corrente, specificato nella valuta di deposito, e poi, quando aprite la prossima, riportare il lotto a quello di partenza?
//+-----------------------------------------------------------------------------------------------+//| Simple Moving Average.mq4 |//| Copyright 2016, Andrey Minaev |//| https://www.mql5.com/ru/users/id.scorpion |//+-----------------------------------------------------------------------------------------------+#property copyright"Copyright 2016, Andrey Minaev"#property link"https://www.mql5.com/ru/users/id.scorpion"#property version"1.00"#property strict// Параметры советникаexternstring sParametersEA = ""; // Параметры советникаexterndouble dLots = 0.01; // Количество лотовexternint iStopLoss = 30; // Уровень убытка (в пунктах)externint iTakeProfit = 30; // Уровень прибыли (в пунктах)externint iSlippage = 3; // Проскальзование (в пунктах)externint iMagic = 1; // Индентификатор советникаexterndouble K_Martin = 2.0;
externint OrdersClose = 5;
externint DigitsLot = 2;
// Параметры индикатораexternstring sParametersMA = ""; // Параметры индикатораexternint iPeriodMA = 14; // Период усреднения// Глобальные переменныеdouble dMA;
//+-----------------------------------------------------------------------------------------------+intOnInit()
{
// Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10if(Digits == 3 || Digits == 5)
{
iStopLoss *= 10;
iTakeProfit *= 10;
iSlippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+-----------------------------------------------------------------------------------------------+voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0, iPeriodMA, 0, MODE_SMA, PRICE_CLOSE, 0);
// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция проверки открытых оредров |//+-----------------------------------------------------------------------------------------------+bool bCheckOrders()
{
// Переберем в цикле ордера, для проверки открытых ордеров данным советникомfor(int i = 0; i <= OrdersTotal(); i++)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMagic)
return(false);
return(true);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на покупку |//+-----------------------------------------------------------------------------------------------+bool bSignalBuy()
{
if(dMA > Open[1] && dMA < Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на продажу |//+-----------------------------------------------------------------------------------------------+bool bSignalSell()
{
if(dMA < Open[1] && dMA > Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на покупку |//+-----------------------------------------------------------------------------------------------+void vOrderOpenBuy()
{
int iOTi = 0; // Тикет ордера
iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, iSlippage, 0, 0, "", iMagic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на продажу |//+-----------------------------------------------------------------------------------------------+void vOrderOpenSell()
{
int iOTi = 0; // Тикет ордера
iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, iSlippage, 0, 0, "", iMagic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
//+-----------------------------------------------------------------------------------------------+//| Функция модификации ордера |//+-----------------------------------------------------------------------------------------------+void vOrderModify(int iOTi)
{
int iOTy = -1; // Тип ордераdouble dOOP = 0; // Цена открытия ордераdouble dOSL = 0; // Стоп Лоссint iMag = 0; // Идентификатор советникаdouble dSL = 0; // Уровень убыткаdouble dTP = 0; // Уровень прибыли// Выберем по тикету открытый ордер, получим некоторые значенияif(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
{
iOTy = OrderType();
dOOP = OrderOpenPrice();
dOSL = OrderStopLoss();
iMag = OrderMagicNumber();
}
// Если ордер открыл данный советник, то входим в условиеif(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
{
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордерif(dOSL == 0)
{
if(iOTy == OP_BUY)
{
dSL = NormalizeDouble(dOOP - iStopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP + iTakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
if(iOTy == OP_SELL)
{
dSL = NormalizeDouble(dOOP + iStopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP - iTakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
}
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция обработки ошибок |//+-----------------------------------------------------------------------------------------------+void vError(int iErr)
{
switch(iErr)
{
case129: // Неправильная ценаcase135: // Цена измениласьcase136: // Нет ценcase138: // Новые ценыSleep(1000);
RefreshRates();
break;
case137: // Брокер занятcase146: // Подсистема торговли занятаSleep(3000);
RefreshRates();
break;
}
}
//+-----------------------------------------------------------------------------------------------+double LOT()
{
int n=0;
double OL=dLots;
for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == iMagic)
{
if (OrderProfit()<0)
{
if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
n++;
if (n>=OrdersClose) {Comment("1");return(dLots);}
}
else
{
if (n==0) {Comment("2");return(dLots);}
else {Comment("3");return(OL);}
}
}
}
}
return(OL);
}
//------------------------------------------------------------------
Grazie per il suggerimento gente , l'ho fatto in questo modo, dice quando va a stop loss o take profit
//--- get transaction type as enumeration valueENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in historyif(type==TRADE_TRANSACTION_DEAL_ADD)
{
long deal_entry =0;
double deal_profit =0.0;
double deal_volume =0.0;
string deal_symbol ="";
long deal_magic =0;
long deal_reason =-1;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
deal_volume=HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
deal_reason=HistoryDealGetInteger(trans.deal,DEAL_REASON);
}
elsereturn;
if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
if(deal_entry==DEAL_ENTRY_OUT)
{
if(deal_reason==DEAL_REASON_SL)
SendNotification (" Закрыл позицию > StopLoss");
if(deal_reason==DEAL_REASON_TP)
SendNotification ("Закрыл позицию > TakeProfit");
}
}
}
e così via un nuovo acquisto o vendita
void OPENORDER(string ord)
{
double priceL=m_symbol.Ask();
if(ord=="Sell")
SendNotification (" открыл позицию > short");//--- 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")
SendNotification (" открыл позицию > long");//--- 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());
Ho bisogno di fare un EA basato su un indicatore, in modo che l'EA possa funzionare senza la presenza di un indicatore. È possibile far apparire sul grafico i dati di un indicatore inscritto in esso, in modo che queste linee non diventino oggetti?
Ho bisogno di fare un EA basato su un indicatore, in modo che l'EA possa funzionare senza l'indicatore. È possibile visualizzare i dati dell'indicatore scritto in esso sul grafico, in modo da non rendere queste linee come oggetti?
Evidenziato...se <0, allora il lotto del trade perdente è aumentato
se >0, allora il lotto di un'operazione in profitto è aumentato
Ciao.
Ho un'altra domanda sul tuo EA
quando l'ho provato su un conto demo, è successo quanto segue:
Quando l'EA raggiunge i parametri specificati, è passato alla modalità "stop", cioè, il pulsante "start" è acceso, ma il trading non si è fermato e gli scambi sono molto brevi, letteralmente uno o due centesimi. È così che dovrebbe essere?
Ho anche scoperto che l'EA ha chiuso alcune operazioni non al prezzo di take o stop e non al limite di denaro, ma "per niente" e il prezzo ha superato varie quantità di punti prima di essere chiuso. Allo stesso tempo, l'Expert Advisor copre completamente le perdite precedenti, di un paio di centesimi, (per esempio, tre affari di fila hanno (-15,59 $) un affare redditizio = +15,62 $ e lo ha chiuso immediatamente!)
ha guardato i log, nessun errore da nessuna parte...
Salve.
Ho un'altra domanda sul vostro Expert Advisor
quando l'ho provato su una demo, è successo quanto segue:
Quando l'EA raggiunge i parametri preimpostati, passa alla modalità "stop", cioè il pulsante "start" è acceso, ma il trading non viene fermato, ma vengono aperti trade molto brevi, solo uno o due centesimi. È così che dovrebbe essere?
Ho anche scoperto che l'EA ha chiuso alcune operazioni non al prezzo di take o stop e non al limite di denaro, ma "per niente" e il prezzo ha superato varie quantità di punti prima di essere chiuso. Allo stesso tempo, l'Expert Advisor copre completamente le perdite precedenti, di un paio di centesimi, (per esempio, tre affari di fila hanno (-15,59 $) un affare redditizio = +15,62 $ e lo ha chiuso immediatamente!)
ha guardato i log, nessun errore da nessuna parte...
Per favore, inviateci il codice con le vostre correzioni. Vedremo.
Pubblica il codice con le tue correzioni. Vedremo.
quindi sto ancora testando quello non corretto, il tuo nativo.
quindi sto ancora testando quello non corretto, quello nativo.
Non vedo alcun errore...
Scrivi quale periodo, su quale coppia e quali parametri erano presenti quando si sono verificati gli errori.
Non vedo alcun errore...
scrivere quale periodo, su quale coppia e quali parametri erano presenti quando si sono verificati gli errori.
queste impostazioni:
timeframe_RSI=0 period_RSI=14 level_buy=30 level_sell=70 Lot=0.01 K_Martin=1.6 Stoploss=200 Takeprofit=1000 CountLoss=100.0 CountProfit=25.0 Magic=777 DigitsLot=2 slippage=3
La relazione è allegata qui sotto.
ci linee gialle con chiusura "poco chiara", né per stop, né per soldi.
e blu - scambi che sono stati aperti e chiusi quasi immediatamente
Ciao!
Per favore consigliatemi quale funzione e dove aggiungere a questo semplice EA,
Oltre ai modi esistenti per resettare molto a quello iniziale,
Se volete chiudere la posizione corrente quando viene raggiunto un drawdown della posizione corrente, specificato nella valuta di deposito, e poi, quando aprite la prossima, riportare il lotto a quello di partenza?
Ecco le impostazioni:
timeframe_RSI=0 period_RSI=14 level_buy=30 level_sell=70 Lot=0.01 K_Martin=1.6 Stoploss=200 Takeprofit=1000 CountLoss=100.0 CountProfit=25.0 Magic=777 DigitsLot=2 slippage=3
La relazione è allegata qui sotto.
ci linee gialle con chiusura "poco chiara", né per stop, né per soldi.
E le linee blu rappresentano accordi che sono stati aperti e chiusi quasi immediatamente.
In quale lasso di tempo?
e così via un nuovo acquisto o vendita
Saluti. Si prega di consigliare su mt5.
Ho bisogno di fare un EA basato su un indicatore, in modo che l'EA possa funzionare senza la presenza di un indicatore.
È possibile far apparire sul grafico i dati di un indicatore inscritto in esso, in modo che queste linee non diventino oggetti?
Saluti. Si prega di consigliare su mt5.
Ho bisogno di fare un EA basato su un indicatore, in modo che l'EA possa funzionare senza l'indicatore.
È possibile visualizzare i dati dell'indicatore scritto in esso sul grafico, in modo da non rendere queste linee come oggetti?
ChartIndicatorAdd()