[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 404

 
Dimka-novitsek:
No puedo organizar un bucle, X e Y siempre son iguales a 0.

En primer lugar, despeja la basura de tu mente.

Haz que tu código sea bonito y estructurado.

Y no seas avaricioso con los comentarios.

 

Sí, por supuesto.

Primero selecciono las órdenes con el número mágico requerido y en ese par de divisas. if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) {

Luego el bucle for( i=OrdersTotal();i==0;i--) en el que selecciono las órdenes así OrderSelect(i,SELECT_BY_POS ); y luego cuento cuántas órdenes como OP_SELLSTOP

Si no hay órdenes, entonces abrimos una orden del tipo de orden que no existe. La variable X en el bucle superior y la variable Y en el bucle inferior se utilizan para contar los pedidos del tipo necesario. Ambos bucles tienen la misma estructura y finalidad.

Ya he escrito con explicaciones, pero aquí vino papá, llamó, trajo leche, té y halva, y no envié ningún mensaje, me fui a orinar, y mi padre borró el mensaje no enviado, dijo, ¿pero qué, podrías escribir en otra ventana del buscador? Me preguntaba qué es la pasta de ortiga. Me asusté un poco y la envié sin casi ninguna explicación.

Bueno, X e Y son siempre 0. El bucle for no debe estar funcionando. No entiendo en absoluto lo que puede no funcionar, debido a esto las órdenes abren 2 en cada tick.


 
Dimka-novitsek:

Sí, por supuesto.

Primero selecciono las órdenes con el número mágico requerido y en ese par de divisas. if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) {

Luego el bucle for( i=OrdersTotal();i==0;i--) en el que selecciono las órdenes así OrderSelect(i,SELECT_BY_POS ); y luego cuento cuántas órdenes como OP_SELLSTOP

Si no hay órdenes, entonces abrimos una orden del tipo de orden que no existe. La variable X en el bucle superior y la variable Y en el bucle inferior se utilizan para contar los pedidos del tipo necesario. Ambos bucles tienen la misma estructura y finalidad.

Ya he escrito con explicaciones, pero aquí vino papá, llamó, trajo leche, té y halva, y no envié ningún mensaje, me fui a orinar, y mi padre borró el mensaje no enviado, dijo, ¿pero qué, podrías escribir en otra ventana del buscador? Me preguntaba qué es la pasta de ortiga. Me asusté un poco y la envié sin casi ninguna explicación.

Bueno, X e Y son siempre 0. El bucle for no debe estar funcionando. En definitiva, no entiendo en absoluto qué puede no estar funcionando ahí, está provocando que las órdenes se abran 2 en cada tick.


Así es, los bucles for no hacen lo que necesitas.

Tiene lo siguiente: for( i=OrdersTotal();i==0;i--)

1) Si hay 0 órdenes, el bucle se ejecutará 1 vez. En este caso, seleccionará la incógnita y hará la incógnita con ella =)

2) Si hay más de 0 pedidos, el bucle no se iniciará, porque no se cumple la condición "i==0".

 
¡¡¡Gracias!!! Volveré a leer la referencia en un momento.
 
¡Sí! ¡Gracias!
 
Ds que sabes, no puedo hacerlo bien, todo es lo mismo.
//+------------------------------------------------------------------+
//|                                                    для лавин.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double stoploss=0; extern double takeprofit=20;extern int otstup=20; extern datetime expiration=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 int tiket,tikett;double volume=0.1;int i=0,R1=0,R2=0,A=1 ;double price=PRICE_OPEN;
   //  R1=((PRICE_OPEN- stoploss*Point)*stoploss)/stoploss;R2=((PRICE_OPEN+ stoploss*Point)*stoploss)/stoploss;
     
     
int start()
  {       int X,Y; double price=(Ask+Bid)/2;            
//----
       Alert ("OrdersTotal()",OrdersTotal());

if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==1000){
 for(int i=OrdersTotal();i>0;i--){Alert ("i", i);
OrderSelect(i,SELECT_BY_POS );if(OrderType( )==OP_BUYSTOP){X++;}}}Alert ("X", X);
if (X==0){


   tiket= OrderSend( Symbol(), OP_BUYSTOP,  volume*A, price +otstup*Point, Point* 3, R1, price+takeprofit*Point+otstup*Point, "OP_BUYSTOP", 1000,  expiration, Red); 
   Alert ("OP_BUYSTOP", GetLastError( )); }
   
if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
 for ( i=OrdersTotal();i>0;i--){Alert ("i", i); OrderSelect(i,SELECT_BY_POS );
if(OrderType( ) ==OP_SELLSTOP) { Y++;}}}Alert ("Y", Y);
 if (Y==0){ 
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, price -otstup*Point, Point* 3,R2, price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
    Alert ("OP_SELLSTOP", GetLastError( )); 
    }       
   
//----
   return(0);
  }
//+-------------------------------------------
En la ayuda dice

La expresión2 es una comprobación de la condición de fin de bucle. Si es verdadero, se ejecuta el operador del cuerpo del bucle for.

etc. He arreglado todo y no ha cambiado nada..también he probado a poner i=5 en lugar de i=OrdersTotal(), no ha cambiado nada, el bucle no funciona.
 
Dimka-novitsek:
El texto de ayuda dice

La expresión2 es una comprobación de la condición de fin de bucle. Si es verdadero, se ejecuta el operador del cuerpo del bucle for.

etc. He arreglado todo y no ha cambiado nada..también he probado a poner i=5 en lugar de i=OrdersTotal(), no ha cambiado nada, el bucle no funciona.

Correcto, el bucle no llega al bucle.

if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==1000){
 for(int i=OrdersTotal();i>0;i--){Alert ("i", i);

Has escrito: "Si el símbolo de orden (¿qué orden? hay muchos... o ninguno) es igual a la orden actual y su magia (¿qué orden?) es igual a 1000, entonces ejecuta el bucle".

y tienes que : "iniciar un bucle. En él: 1) seleccione un pedido. 2) y si símbolo =... y magia =1000, entonces X++;"

 

Algunos CC en cuentas reales asignan todo tipo de prefijos como "." o "FXF" a los nombres de los símbolos.

¿Cómo puedo utilizar estos prefijos?

Lo hice así:

#define DEF_SPEC "FXF"

string SymbolsTrade[] = {"AUDCAD "DEF_SPEC ... -no funciona

string SymbolsTrade[] = {"AUDCAD "+DEF_SPEC ... -tampoco funciona así

como resultado obtengo sólo FXF en lugar de AUDCADFXF.

¿Pueden decirme cómo ponerlo en práctica?
 
pusheax:

Algunos CC en cuentas reales asignan todo tipo de prefijos como "." o "FXF" a los nombres de los símbolos.

¿Cómo puedo utilizar estos prefijos?

Hice esto:

#define DEF_SPEC "FXF"

string SymbolsTrade[] = {"AUDCAD "DEF_SPEC ... -no funciona

string SymbolsTrade[] = {"AUDCAD "+DEF_SPEC ... -tampoco funciona así

como resultado obtengo sólo FXF en lugar de AUDCADFXF.

¿Puede decirme cómo ponerlo en práctica?

Así es como funciona sobre la marcha:

#define DEF_SPEC "FXF"
string SymbolsTrade[] = {"AUDCAD", "EURUSD"};

int init()
{
   for (int i = 0; i < ArraySize(SymbolsTrade); i++)
      SymbolsTrade[i] = SymbolsTrade[i] + DEF_SPEC;
 

Lo tengo, lo haré...

Además, la condición no funciona.

OrderSelect(i,SELECT_BY_POS );
if(OrderType( ) ==OP_SELLSTOP) { Y++;}Alert ("Y", Y);}
Razón de la queja: