Resaltado...si <0, entonces el lote de la operación perdedora se incrementa
si >0, entonces el lote de una operación con beneficios se incrementa
Hola.
Tengo otra pregunta sobre su EA
Al probarlo en una cuenta demo, ocurrió lo siguiente:
Cuando el EA alcanza los parámetros especificados, ha pasado al modo "stop", es decir, el botón "start" está encendido, pero la negociación no se ha detenido y las operaciones son muy cortas, literalmente uno o dos céntimos. ¿Es así como debe ser?
También he descubierto que el EA ha cerrado algunas operaciones no al precio de toma o de parada y no al límite de dinero, sino "para nada" y el precio ha pasado varias cantidades de puntos antes de ser cerrado. Al mismo tiempo, el Asesor Experto cubre completamente las pérdidas anteriores, por un par de centavos, (por ejemplo, tres operaciones seguidas tienen (-15.59 $) una operación rentable = +15.62 $ y la cerró inmediatamente)
miré los registros, no hay errores en ninguna parte...
Cuando el EA alcanza los parámetros preestablecidos, pasa al modo "stop", es decir, el botón de "inicio" está encendido, pero la negociación no se detiene, sino que se abren operaciones muy cortas, sólo uno o dos céntimos. ¿Es así como debe ser?
También he comprobado que el EA ha cerrado algunas operaciones no en la toma o en el stop y no en el límite de dinero, sino "para nada" y el precio ha pasado varias cantidades de puntos antes de ser cerrado. Al mismo tiempo, el Asesor Experto cubre completamente las pérdidas anteriores, por un par de centavos, (por ejemplo, tres operaciones seguidas tienen (-15.59 $) una operación rentable = +15.62 $ y la cerró inmediatamente)
miré los registros, no hay errores en ninguna parte...
Por favor, envíenos el código con sus correcciones. Ya veremos.
Por favor, aconseja qué función y dónde añadir a este simple EA,
Además de las formas existentes para restablecer mucho a la inicial,
¿Si quiere cerrar la posición actual cuando se alcanza una reducción de la posición actual, especificada en la moneda del depósito, y luego, al abrir la siguiente, restablecer el lote al inicial?
//+-----------------------------------------------------------------------------------------------+//| 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);
}
//------------------------------------------------------------------
Gracias por el consejo gente , lo hice de esta manera, dice cuando va al 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");
}
}
}
y así en una nueva compra o venta
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());
Necesito hacer un EA basado en un indicador, para que el EA pueda funcionar sin la presencia de un indicador. ¿Es posible hacer que los datos de un indicador inscrito en él se muestren en el gráfico, para que estas líneas no se conviertan en objetos?
Necesito hacer un EA basado en un indicador, para que el EA pueda funcionar sin el indicador. ¿Es posible mostrar los datos del indicador escrito en él en el gráfico, para no hacer estas líneas como objetos?
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
Resaltado...si <0, entonces el lote de la operación perdedora se incrementa
si >0, entonces el lote de una operación con beneficios se incrementa
Hola.
Tengo otra pregunta sobre su EA
Al probarlo en una cuenta demo, ocurrió lo siguiente:
Cuando el EA alcanza los parámetros especificados, ha pasado al modo "stop", es decir, el botón "start" está encendido, pero la negociación no se ha detenido y las operaciones son muy cortas, literalmente uno o dos céntimos. ¿Es así como debe ser?
También he descubierto que el EA ha cerrado algunas operaciones no al precio de toma o de parada y no al límite de dinero, sino "para nada" y el precio ha pasado varias cantidades de puntos antes de ser cerrado. Al mismo tiempo, el Asesor Experto cubre completamente las pérdidas anteriores, por un par de centavos, (por ejemplo, tres operaciones seguidas tienen (-15.59 $) una operación rentable = +15.62 $ y la cerró inmediatamente)
miré los registros, no hay errores en ninguna parte...
Hola.
Tengo otra pregunta sobre su Asesor Experto
Al probarlo en una demo, ocurrió lo siguiente:
Cuando el EA alcanza los parámetros preestablecidos, pasa al modo "stop", es decir, el botón de "inicio" está encendido, pero la negociación no se detiene, sino que se abren operaciones muy cortas, sólo uno o dos céntimos. ¿Es así como debe ser?
También he comprobado que el EA ha cerrado algunas operaciones no en la toma o en el stop y no en el límite de dinero, sino "para nada" y el precio ha pasado varias cantidades de puntos antes de ser cerrado. Al mismo tiempo, el Asesor Experto cubre completamente las pérdidas anteriores, por un par de centavos, (por ejemplo, tres operaciones seguidas tienen (-15.59 $) una operación rentable = +15.62 $ y la cerró inmediatamente)
miré los registros, no hay errores en ninguna parte...
Por favor, envíenos el código con sus correcciones. Ya veremos.
Publique el código con sus correcciones. Veremos.
así que todavía estoy probando el que no está corregido, el nativo.
así que sigo probando el no corregido, el nativo.
No veo ningún error...
Escriba qué período, en qué par y qué parámetros había cuando se produjeron los errores.
No veo ningún error...
escriba qué período, en qué par y qué parámetros estaban presentes cuando se produjeron los errores.
estos ajustes:
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
El informe se adjunta a continuación.
allí líneas amarillas con cierre "poco claro", ni por parada, ni por dinero.
y azul - operaciones que se abrieron y cerraron casi inmediatamente
¡Hola!
Por favor, aconseja qué función y dónde añadir a este simple EA,
Además de las formas existentes para restablecer mucho a la inicial,
¿Si quiere cerrar la posición actual cuando se alcanza una reducción de la posición actual, especificada en la moneda del depósito, y luego, al abrir la siguiente, restablecer el lote al inicial?
Aquí están los ajustes:
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
El informe se adjunta a continuación.
hay líneas amar illas con cierre "poco claro", ni por stop, ni por take profit, ni por dinero.
Y las líneas azules representan las operaciones que se abrieron y cerraron casi inmediatamente.
¿En qué plazo?
y así en una nueva compra o venta
Saludos. Por favor, aconséjame sobre mt5.
Necesito hacer un EA basado en un indicador, para que el EA pueda funcionar sin la presencia de un indicador.
¿Es posible hacer que los datos de un indicador inscrito en él se muestren en el gráfico, para que estas líneas no se conviertan en objetos?
Saludos. Por favor, aconséjame sobre mt5.
Necesito hacer un EA basado en un indicador, para que el EA pueda funcionar sin el indicador.
¿Es posible mostrar los datos del indicador escrito en él en el gráfico, para no hacer estas líneas como objetos?
ChartIndicatorAdd()