Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 982

 
 int x=0;
 int scale_mas[13]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096};//объявление массива

 for(int i=0;i < ArraySize(scale_mas);i++){
    if(x == scale_mas[0])x = scale_mas[1];                       //если х=индекс0, то х=индекс1
    if(x >= ArraySize(scale_mas))x = scale_mas[11];              //если х>= размер массива, то х=индекс11
    i=x;
    if(ObjectGetInteger(0, "Button+", OBJPROP_STATE) == false){  //если кнопка "+" нажата
       i=i+1;                                                    //увеличиваем индекс на 1
       ObjectSetInteger(0, "Button+", OBJPROP_STATE,true);}
                        
    x=i;							 //присваиваем х значение последнего индекса
    if(ObjectGetInteger(0, "Button-", OBJPROP_STATE) == false){  //если кнопка "-" нажата
       i=i-1;                                                    //уменьшаем индекс на 1
    ObjectSetInteger(0, "Button-", OBJPROP_STATE,true);}
                            
    x=i;                                                         //присваиваем х значение последнего индекса
 ObjectSetString(0,"=TrendLine",OBJPROP_TEXT,scale_mas[x]);}}    //выводим результат scale_mas[x]
Ayer escribí el código, parece que funciona como debería, pero sólo cuando llego al valor superior del array con el botón más, se reinicia al principio del array y vuelve a subirlo. ¿Qué puedo añadir o arreglar en el código, para que cuando se alcance el valor superior del array, los siguientes clics en el botón más se detengan en el índice superior y no se restablezca al fondo del array? ¿O se puede simplificar el código de alguna otra manera para implementar esta idea de pulsar el botón?
 
Ivan Revedzhuk:
Ayer escribí el código, parece que funciona como debería, pero sólo cuando llego al valor superior del array con el botón más, se reinicia al principio del array y vuelve a subirlo. ¿Qué puedo añadir o arreglar en el código, para que cuando se alcance el valor superior del array, los siguientes clics en el botón más se detengan en el índice superior y no se restablezca al fondo del array? ¿O se puede simplificar el código de alguna otra manera para implementar esta idea de pulsar el botón?
if(x >= ArraySize(scale_mas))
 ArraySize(scale_mas)-1;              //если х>= размер массива, то ....

Probablemente sí.

 
Alexey Viktorov:

Supongo que sí.

Probado también, funciona igual

 
Ivan Revedzhuk:

Probado también, funciona igual

No me di cuenta de inmediato, ¿para qué es el ciclo?

 
Alexey Viktorov:

No me di cuenta de inmediato, pero ¿para qué sirve el bucle?

¿Hay alguna forma de hacerlo sin él? No sé qué es lo mejor y sólo hago lo que me parece lógico.

 
Ivan Revedzhuk:

¿Hay alguna forma de hacerlo sin él? Simplemente no sé qué es lo mejor y hago lo que me parece lógico.

La lógica debe ser diferente. Al pulsar el botón + se incrementa el índice de la matriz. Alcanzado el máximo, no aumenta, sino que se mantiene en el máximo. Pulsando el botón, el índice disminuye. Alcanzado el cero, no reacciona al pulsar, se queda en el índice 0.

¿O se le ocurrió alguna otra idea?

P.D.: ¿Y quién publicó el ejemplo de trabajo con banderas, en respuesta a esta pregunta y lo borró? ¿Por qué lo has borrado? Después de todo, es una buena solución para el hombre. ¿Por qué iba a necesitar un conjunto limitado?
 
Alexey Viktorov:

La lógica debe ser diferente. Al pulsar el botón + se incrementa el índice de la matriz. Alcanzado el máximo, no aumenta, sino que se mantiene en el máximo. Pulsando el botón, el índice disminuye. Llega a cero, no responde, se queda en el índice 0.

¿O se le ocurrió alguna otra idea?

P.D.: ¿Y quién publicó el ejemplo de trabajo con banderas, en respuesta a esta pregunta y lo borró? ¿Por qué lo has borrado? Después de todo, es una buena solución para el hombre. ¿Por qué iba a necesitar un conjunto limitado?

No, esa era exactamente la idea. Realmente no sé cómo hacerlo correctamente, así que lo hice como lo conseguí. Pero me he dado cuenta de que cuando el bucle se ejecuta en el programa, mientras no haga clic en los botones del gráfico, todo lo demás no funciona. Es como si todo estuviera en pausa. No entiendo por qué sucede esto, si hay alguna variante para implementar la idea de manera diferente, lo agradecería...

 

Eso es todo. El problema está resuelto) sin arrays y otras cosas. Resultó ser mucho más sencillo))))

La segunda pregunta surgió. ¿Cómo puedo establecer el nivel de activación de la alerta en el código con la flecha de ajuste que aparece cuando la alerta se establece a través del menú contextual con el ratón?

Pregunta sobre la alerta

 

Por favor, ayuda, plz, es posible añadir una función a este EA, para que el EA establecido en la ventana EURUSD abrirá un acuerdo con los mismos parámetros, al mismo tiempo, pero para GBPUSD, y EURUSD no se abrirá.

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| Desarrollador: Minaev Andrey |

//| Asesor Experto: Estocástico.mq4 |

|| Sitio web: safe-forex.|| Sitio web: safe-forex. |

//| Correo:minaev.work@mail.ru |

//| Skype: live:minaev.trabajo |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

#property copyright "Safe-Forex.ru"

#enlace de propiedad "https://safe-forex.ru"

#propiedad estricta


extern bool Usar_Símbolo1 = true;

cadena externa Symbol1 = "USDJPY";


input string settings = ""; // Configuración del Asesor Experto

input int magic = 111; // input magic

input double fixVolume = 0.01; // Volumen

input int takeProfit = 500; // Beneficio

input int stopLoss = 500; //Pérdida

input int buyLevel = 100; // input int buy Level

input int sellLevel = 0; // 75 Nivel de venta


extern int ADXperiod = 15; //Periodo ADX 15

extern int ADXLevel =1;


extern int MAperiod =360; //Periodo MA 80

extern int MAperiod_2 =360; //Periodo MA 80



input string stochSettings = ""; // Configuración del indicador Oscilador Estocástico

input int stochPeriodK = 5; //periodo %K

input int stochPeriodD = 3; //periodo %D

input int stochSlowing = 3; // Ralentización

input ENUM_STO_PRICE stochPrice = STO_LOWHIGH; // Precio

input ENUM_MA_METHOD stochMethod = MODE_SMA; // Método


datetime newCandle; // nueva vela en el gráfico actual

bool allowOpenBuy; // permiso para abrir la posición de compra

allowOpenSell; // permiso para abrir la posición de venta

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

int OnInit(void)

{

return INIT_SUCCEED;

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OnTick(void)

{

if(newCandle!=Time[0]) CheckSignalExist(); newCandle=Time[0];

if(allowOpenBuy) OpenPosition(OP_BUY);

if(allowOpenSell) OpenPosition(OP_SELL);

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La función abre la posición al precio actual |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OpenPosition(int type)

{


doble precio=0,0;

if(type==OP_BUY) price=Pedir;

if(type==OP_SELL) price=Bid;

int ticket=EnviarOrden(_Símbolo,tipo,volumenfijo,precio,0,0,",magia,0);

// int ticket=OrderSend(,type,fixVolume,price,0,0,0,",magic,0);

Sleep(1000);

if(ticket>0)

{

if(type==OP_BUY)

{

Print("Posición de compra abierta, ticket: ",ticket);

allowOpenBuy=false;

// SetStopOrders(ticket);

}

if(type==OP_SELL)

{

Print("Posición de venta abierta, ticket: ",ticket);

allowOpenSell=false;

// SetStopOrders(ticket);

}

}

if(ticket<0)

{

if(type==OP_BUY) Print("La posición de compra no se abrió, error: ",GetLastError());

if(type==OP_SELL) Print("La posición de venta no se abrió, error: ",GetLastError());

}

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La función establece la orden de parada |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//void SetStopOrders(int ticket)

//{

// double stopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL),

// spread =MarketInfo(_Symbol,MODE_SPREAD),

// tp =takeProfit,

// sl =stopLoss;

// stopLevel+=spread;

// if(tp<stopLevel)

// {

// tp=nivel de parada;

// Print("Distancia mínima para el conjunto de beneficios");

// }

// if(sl<stopLevel)

// {

// sl=nivel de parada;

// Print("Distancia mínima para el conjunto de pérdidas");

// }

// if(OrderSelect(ticket,SELECT_BY_TICKET))

// {

// int type=OrderType();

// double opp =OrderOpenPrice();

// if(type==OP_BUY) {tp=opp+tp*_Point; sl=opp-sl*_Point;}

// if(type==OP_SELL) {tp=topp-tp*_Point; sl=opp+sl*_Point;}

// if(OrderModify(ticket,opp,sl,tp,0))

// {

// if(type==OP_BUY) Print("Niveles de pérdidas y ganancias establecidos para la posición de compra, ticket: ",ticket);

// if(type==OP_SELL) Print("Se han establecido los niveles de pérdidas y ganancias para la posición de venta, ticket: ",ticket);

// }

// si no {

// if(type==OP_BUY) Print("No se han establecido los niveles de pérdidas y ganancias para la posición de compra, ticket: ",ticket," error: ",GetLastError());

// if(type==OP_SELL) Print("Los niveles de pérdidas y ganancias para la posición de venta no se han establecido; ticket: ",ticket," error: ",GetLastError();

// }

// }

//}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La función comprueba la presencia de la señal |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void CheckSignalExist(void)


{

double ADX1=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,1); ////////////////////////////

double ADX2=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,2);

double DPLUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_PLUSDI,1);

double DMINUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_MINUSDI,1);

double MA=iMA(Symbol(),Period(),MAperiod,0,MODE_SMA,0,1);

double MA_2=iMA(Symbol(),Period(),MAperiod_2,0,MODE_SMA,0,1);


//PERIOD_H1

double mainLine1=iStochastic(_Símbolo,PERIOD_CURRENTE,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,1),

mainLine2=iStochastic(_Símbolo,PERIOD_CURRENTE,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,2),

signLine1=iStochastic(_Símbolo,PERIOD_CURRENTE,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,1),

signLine2=iStochastic(_Símbolo,PERIOD_CURRENTE,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,2);

Comentario(" ", (Ask-Bid)/1,5," ",Bid-Close[1]," ", Ask-Close[1]);

// if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

//& iClose(Symbol(),Period(),1)>MA& iClose(Symbol(),Period(),1)>MA_2 && signLine1<buyLevel && signLine2<buyLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

//&Close[2]<MA& Close[2]<MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] > Close[1]-(Close[1]-Close[20])

&& Close[10]>Bid )

{

Print("Ha aparecido una señal para abrir una posición de compra");

if(GetPositionsNumber()==0)

{

// allowOpenSell=true;

{ allowOpenBuy=true;

Sleep(1000);

Print("Permitido abrir posición de compra");

}

}

// if(mainLine1<signLine1 && mainLine2>signLine2 && mainLine1>sellLevel && ADX1>ADXLevel&& mainLine2>sellLevel

//& iClose(Symbol(),Period(),1)<MA& iClose(Symbol(),Period(),1)<MA_2 && signLine1>sellLevel && signLine2>sellLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

//&Close[2]>MA& Close[2]>MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] < Close[1]+(Close[20]-Close[1])

&& Close[10]<Ask )

{

Print("Ha aparecido una señal para abrir una posición de venta");

if(GetPositionsNumber()==0)

{

// allowOpenBuy=true;

allowOpenSell=true;

Sleep(1000);

Print("Permitido abrir posición de venta");

}

}

}
















/////////////////////////////////////////



//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La función devuelve el número de posiciones abiertas |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+







int GetPositionsNumber(void)

{

int número=0;

for(int i=0; i<TotalPedidos(); i++)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderSymbol()==_Symbol && OrderMagicNumber()==magic)

número++;

número de devolución;

}

//+---------------------------------------------------------------------------------------------------------------------------------

 
vvs1:

Ayuda, plz, es posible añadir una función a este EA, para que el EA instalado en la ventana de EURUSD abra una operación con los mismos parámetros de apertura, al mismo tiempo, pero en GBPUSD, y EURUSD no se abra.

Lo siento, ¿tu cabeza está bien? No sólo has insertado el código en un lugar, sino que además has dejado una gran cantidad de líneas vacías.

¿No crees que deberías tener algo de respeto por quien te pide ayuda?

Razón de la queja: