Hervorgehoben...wenn <0, dann wird das Los des Verlustgeschäfts erhöht
wenn >0, dann wird das Los eines Gewinngeschäfts erhöht
Hallo.
Ich habe eine weitere Frage zu Ihrem EA
Beim Testen auf einem Demokonto ist folgendes passiert:
Wenn der EA die angegebenen Parameter erreicht hat, ist er in den "Stop"-Modus übergegangen, d.h. die "Start"-Taste leuchtet, aber der Handel wurde nicht gestoppt und die Trades sind sehr kurz, buchstäblich ein oder zwei Cents. Ist das der richtige Weg?
Ich habe auch herausgefunden, dass der EA einige Geschäfte nicht zum Mitnahme- oder Stoppkurs und nicht zum Geldlimit geschlossen hat, sondern "umsonst", und der Kurs hat mehrere Punkte überschritten, bevor er geschlossen wurde. Gleichzeitig deckt der Expert Advisor die vorangegangenen Verluste vollständig ab, und zwar um ein paar Cent (z.B. drei Geschäfte in Folge haben (-15,59 $) ein gewinnbringendes Geschäft = +15,62 $ und schließen es sofort!)
Ich habe mir die Protokolle angesehen, nirgendwo Fehler...
Ich habe eine weitere Frage zu Ihrem Expert Advisor
Beim Testen auf einer Demo ist folgendes passiert:
Wenn der EA die voreingestellten Parameter erreicht, schaltet er in den "Stop"-Modus, d.h. die "Start"-Taste ist eingeschaltet, aber der Handel wird nicht gestoppt, sondern es werden sehr kurze Trades eröffnet, nur ein oder zwei Cents. Ist das der richtige Weg?
Ich habe auch herausgefunden, dass der EA einige Geschäfte nicht bei Take oder Stop und nicht am Geldlimit geschlossen hat, sondern "umsonst" und der Preis hat verschiedene Mengen an Punkten überschritten, bevor er geschlossen wurde. Gleichzeitig deckt der Expert Advisor die vorangegangenen Verluste vollständig ab, und zwar um ein paar Cent (z.B. drei Geschäfte in Folge haben (-15,59 $) ein gewinnbringendes Geschäft = +15,62 $ und schließen es sofort!)
Ich habe mir die Protokolle angesehen, nirgendwo Fehler...
Bitte senden Sie uns den Code mit Ihren Korrekturen. Wir werden sehen.
Bitte empfehlen Sie mir, welche Funktion und wo ich sie diesem einfachen EA hinzufügen soll,
Zusätzlich zu den bestehenden Möglichkeiten, eine Menge auf die ursprüngliche zurückzusetzen,
Wenn Sie die aktuelle Position schließen möchten, wenn ein in der Einzahlungswährung festgelegter Drawdown der aktuellen Position erreicht ist, und dann, wenn Sie die nächste Position eröffnen, das Lot auf den Startwert zurücksetzen möchten?
//+-----------------------------------------------------------------------------------------------+//| 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);
}
//------------------------------------------------------------------
Danke für den Tipp Leute , ich habe es so gemacht, es sagt, wenn es zum Stop Loss oder Take Profit geht
//--- 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");
}
}
}
und so weiter zu einem neuen Kauf oder Verkauf
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());
Ich muss einen EA erstellen, der auf einem Indikator basiert, so dass der EA auch ohne einen Indikator funktionieren kann. Ist es möglich, die Daten eines Indikators auf dem Chart anzuzeigen, so dass diese Linien nicht zu Objekten werden?
Ich muss einen EA machen, der auf einem Indikator basiert, so dass der EA ohne den Indikator funktionieren kann. Ist es möglich, die Daten des Indikators, die darin geschrieben sind, auf dem Diagramm anzuzeigen, so dass diese Linien nicht als Objekte erscheinen?
Hervorgehoben...wenn <0, dann wird das Los des Verlustgeschäfts erhöht
wenn >0, dann wird das Los eines Gewinngeschäfts erhöht
Hallo.
Ich habe eine weitere Frage zu Ihrem EA
Beim Testen auf einem Demokonto ist folgendes passiert:
Wenn der EA die angegebenen Parameter erreicht hat, ist er in den "Stop"-Modus übergegangen, d.h. die "Start"-Taste leuchtet, aber der Handel wurde nicht gestoppt und die Trades sind sehr kurz, buchstäblich ein oder zwei Cents. Ist das der richtige Weg?
Ich habe auch herausgefunden, dass der EA einige Geschäfte nicht zum Mitnahme- oder Stoppkurs und nicht zum Geldlimit geschlossen hat, sondern "umsonst", und der Kurs hat mehrere Punkte überschritten, bevor er geschlossen wurde. Gleichzeitig deckt der Expert Advisor die vorangegangenen Verluste vollständig ab, und zwar um ein paar Cent (z.B. drei Geschäfte in Folge haben (-15,59 $) ein gewinnbringendes Geschäft = +15,62 $ und schließen es sofort!)
Ich habe mir die Protokolle angesehen, nirgendwo Fehler...
Hallo.
Ich habe eine weitere Frage zu Ihrem Expert Advisor
Beim Testen auf einer Demo ist folgendes passiert:
Wenn der EA die voreingestellten Parameter erreicht, schaltet er in den "Stop"-Modus, d.h. die "Start"-Taste ist eingeschaltet, aber der Handel wird nicht gestoppt, sondern es werden sehr kurze Trades eröffnet, nur ein oder zwei Cents. Ist das der richtige Weg?
Ich habe auch herausgefunden, dass der EA einige Geschäfte nicht bei Take oder Stop und nicht am Geldlimit geschlossen hat, sondern "umsonst" und der Preis hat verschiedene Mengen an Punkten überschritten, bevor er geschlossen wurde. Gleichzeitig deckt der Expert Advisor die vorangegangenen Verluste vollständig ab, und zwar um ein paar Cent (z.B. drei Geschäfte in Folge haben (-15,59 $) ein gewinnbringendes Geschäft = +15,62 $ und schließen es sofort!)
Ich habe mir die Protokolle angesehen, nirgendwo Fehler...
Bitte senden Sie uns den Code mit Ihren Korrekturen. Wir werden sehen.
Poste deinen Code mit deinen Korrekturen. Wir werden sehen.
also teste ich immer noch die unkorrigierte, Ihre native.
Ich teste also immer noch die unkorrigierte Version, Ihre ursprüngliche Version.
Ich sehe keine Fehler...
Schreiben Sie, in welchem Zeitraum, bei welchem Paar und mit welchen Parametern die Fehler aufgetreten sind.
Ich sehe keine Fehler...
schreiben, in welchem Zeitraum, bei welchem Paar und mit welchen Parametern die Fehler aufgetreten sind.
diese Einstellungen:
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
Bericht ist unten beigefügt.
dort gelbe Linien mit "unklarer" Schließung, weder durch Stop, Take, noch durch Geld.
und blau - Geschäfte, die fast sofort eröffnet und geschlossen wurden
Hallo!
Bitte empfehlen Sie mir, welche Funktion und wo ich sie diesem einfachen EA hinzufügen soll,
Zusätzlich zu den bestehenden Möglichkeiten, eine Menge auf die ursprüngliche zurückzusetzen,
Wenn Sie die aktuelle Position schließen möchten, wenn ein in der Einzahlungswährung festgelegter Drawdown der aktuellen Position erreicht ist, und dann, wenn Sie die nächste Position eröffnen, das Lot auf den Startwert zurücksetzen möchten?
Hier sind die Einstellungen:
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
Bericht ist unten beigefügt.
dort gelbe Linien mit "unklarer" Schließung, weder durch Stop, Take, noch durch Geld.
Und die blauen Linien stehen für Geschäfte, die fast sofort eröffnet und geschlossen wurden.
In welchem Zeitrahmen?
und so weiter zu einem neuen Kauf oder Verkauf
Grüße. Bitte beraten Sie mich zu mt5.
Ich muss einen EA erstellen, der auf einem Indikator basiert, so dass der EA auch ohne einen Indikator funktionieren kann.
Ist es möglich, die Daten eines Indikators auf dem Chart anzuzeigen, so dass diese Linien nicht zu Objekten werden?
Grüße. Bitte beraten Sie mich zu mt5.
Ich muss einen EA machen, der auf einem Indikator basiert, so dass der EA ohne den Indikator funktionieren kann.
Ist es möglich, die Daten des Indikators, die darin geschrieben sind, auf dem Diagramm anzuzeigen, so dass diese Linien nicht als Objekte erscheinen?
ChartIndicatorAdd()