Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 44
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2012, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
extern double Lots=0.01; //Oбьем открываемого ордера
extern double Martin=2;
extern int Step=200;
extern int TakeProfit=250;
extern const string Настройки_работы_советника="";
int Period1=6;//Период 1МА
ENUM_APPLIED_PRICE PRICE1=PRICE_MEDIAN; // 1МА По цене
int Period2=50;//Период 2МА
ENUM_APPLIED_PRICE PRICE2=PRICE_MEDIAN; // 2МА По цене
int Period3=800;//Период 3МА
ENUM_APPLIED_PRICE PRICE3=PRICE_MEDIAN; // 3МА По цене
int Period4=25;//Период 4МА
ENUM_APPLIED_PRICE PRICE4=PRICE_MEDIAN; // 4МА По цене, вспомогательная
uint X=20; // отклонение от ма, пунктов
int i; // исходный счетчик ордеров
bool dummy; // для выхода функций в переменную
int ticket; // тикет открываемого ордера
int Magic=444; // Magic Number
int lastlot,tp;
double price;
int count;
int otype;
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
void OnTick()
{
{
if(Bars<801) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
return;
}
//+----------------------------------------------------------------Сборник параметров индикаторов
double ma1=NormalizeDouble(iMA(NULL,0,Period1,0,MODE_SMA,PRICE1,1),5); //+----6
double ma2=NormalizeDouble(iMA(NULL,0,Period2,0,MODE_SMA,PRICE2,1),5); //+----50
double ma3=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,1),5); //+----800
double ma31=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,10),5); //+----800
double ma32=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,20),5); //+----800
double ma33=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,30),5); //+----800
double ma4=NormalizeDouble(iMA(NULL,0,Period4,0,MODE_SMA,PRICE4,0),5); //+----25
//+----------------------------------------------------------------- Открытие ордеров по 25-50 ма
//+-------------------------------------------------- открыть ордер
if(Counts()==0) //+-------------если количество ордеров равно 0
{
if((MathAbs(ma2-ma4)>30*_Point)
&& (MathAbs(Bid-ma3)>100*Point())
&& (ma31>ma32>ma33)) //+-----покупка по 6+50
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",Magic,0,clrAzure);//+-------------отправка 1 ордера
}
if((MathAbs(ma2-ma3)>30*_Point))//+-------------условие продажи
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",Magic,0,clrAzure);//+-------------отправка 1 ордера
}
if (ticket==0)
{
return;
}
}
else //+------------если уже есть
{
if(FindLastOType()==OP_BUY)
{
if(Ask<=FindLastOrderOpenPrice()-Step*Point())
{
ticket=OrderSend(Symbol(),OP_BUY,(FindLastLot()*Martin),Ask,0,0,0,"",Magic,0,clrAzure);
ModifyOrders();
myOrdersCloseTotal();
}
}
if(FindLastOType()==OP_SELL)
{
if(Bid>=FindLastOrderOpenPrice()+Step*Point())
{
ticket=OrderSend(Symbol(),OP_SELL,(FindLastLot()*Martin),Bid,0,0,0,"",Magic,0,clrAzure);
ModifyOrders();
myOrdersCloseTotal();
}
}
}
}
//+-------------------------------------------------------------количество ордеров в рынке
int Counts()
{
count=0;
for(i=OrdersTotal()-1; i>=0; i--) // цикл будет работать пока не останется ордеров
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && (OrderTicket()==ticket))
count++;
}
}
return(count);
}
//+---------------------------------------------------------------найти тип последнего ордера
int FindLastOType()
{
for(i=OrdersTotal()-1; i>=0; i--) // цикл будет работать пока не останется ордеров
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && (OrderTicket()==ticket))
return(OrderType());
}
}
return(-1);
}
//+--------------------------------------------------------------вернуть цену последнего открытого ордера
double FindLastOrderOpenPrice()
{
int oldticket;
ticket=0;
double oldorderopenprice=0;
for(i=OrdersTotal()-1; i>=0; i--) // цикл будет работать пока не останется ордеров
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic) && (OrderType()<2))
{
oldticket=OrderTicket();
if(oldticket>ticket)
{
ticket=oldticket;
oldorderopenprice=OrderOpenPrice();
}
}
}
return(oldorderopenprice);
}
//+--------------------------------------------------------------вернуть объем последнего ордера
double FindLastLot()
{
int oldticket;
ticket=0;
double oldlots=0;
for(i=OrdersTotal()-1; i>=0; i--) // цикл будет работать пока не останется ордеров
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic)
&& (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
oldticket=OrderTicket();
if(oldticket>ticket)
{
ticket=oldticket;
oldlots=OrderLots();
}
}
}
return(oldlots);
}
//+---------------------------------------------------------закрыть все если хоть один из серии закрылся
int myOrdersCloseTotal()
{
int myOrderS=0;
for(i=OrdersTotal()-1; i>0; i--)
{
if(((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==true) && OrderSymbol()==Symbol() && (OrderType()<2))
{
myOrderS=OrdersTotal();
}
else
dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));
}
return (myOrderS);
}
//+------------------------------------------------модификация существующих расчет тейка по средней цене
void ModifyOrders()
{
bool z=true;
double avg_price=0;
price=0;
double orderlots=0;
for(i=OrdersTotal()-1; i>=0; i--)
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
&& (OrderMagicNumber()==Magic) && (FindLastOType()==OP_BUY))
{
price=(OrderOpenPrice()*OrderLots());
orderlots=FindLastLot();
avg_price=NormalizeDouble(price/orderlots,Digits);
tp=(avg_price+TakeProfit*Point()); //+------------------------------------тут деление на 0 второго ордера
z=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0);
if (!z)
Print("Ошибка функции модифицирования");
}
}
for(i=OrdersTotal()-1; i>=0; i--)
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
&& (OrderMagicNumber()==Magic) &&(FindLastOType()==OP_SELL))
{
price=(OrderOpenPrice()*OrderLots());
orderlots=FindLastLot();
avg_price=NormalizeDouble(price/orderlots,Digits);
tp=(avg_price-TakeProfit*Point()); //+------------------------------------тут деление на 0 второго ордера
z=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0);
if (!z)
Print("Ошибка функции модифицирования");
}
}
}
/*
*/
//+------------------------------------------------------------------+
Ya está, bien hecho.
Y ahora las líneas que el compilador maldice.
No quiero parecer intruso en esta sociedad, pero nadie me ha explicado nunca de dónde viene el 0 en los cálculos...
puesto 413
posible pérdida de datos debido a la conversión del tipo count.mq4 231 12
posible pérdida de datos debido a la conversión del tipo count.mq4 246 12
¿Eres incapaz de entender que las AT y los lotes no deben escribirse en una variable entera? ¿Por qué es así?
¿Podemos ver cómo se escriben estas cosas correctamente?
Una vez más, ¿quieres saber qué había en el indicador en H1 la última hora, o quieres saber qué está pasando en el indicador en H1 en este momento?
Necesita los valores del indicador, en la primera barra cerrada H1.
¿Podemos ver cómo se registran estas cosas correctamente?
double lastlot,tp;
¿Podemos ver cómo se registran estas cosas correctamente?
.
Gracias, los errores han desaparecido. Pero el bot sigue muriendo al arrancar, junto con el terminal, pero sin razón aparente
TestGenerator: error de datos no coincidentes (límite de volumen 262 en 2016.12.02 12:45 superado)
TestGenerator: error de datos no coincidentes (el valor alto 1,10131 en 2016.10.13 10:05 no se alcanza desde el marco temporal más bajo, el precio alto 1,10123 no coincide)
Gracias, los errores han desaparecido. Pero el bot sigue muriendo al arrancar junto con el terminal, pero sin ninguna razón aparente
TestGenerator: error de datos no coincidentes (límite de volumen 262 en 2016.12.02 12:45 superado)
TestGenerator: error de datos no coincidentes (el valor alto 1,10131 en 2016.10.13 10:05 no se alcanza desde el marco temporal más bajo, el precio alto 1,10123 no coincide)
No es el bot el que "muere", es la historia. Aprende inglés, al menos con un diccionario.
¿Y en todos los humos a la vez una historia de mierda? ¿Coincidencia?
¿Y en todos los humos a la vez una historia de mierda? ¿Coincidencia?