Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 538

 
denis77515:

Hola Sr. profesionales.No te niegues a un recién llegado a la programación, mira el código, para ver si está escrito correctamente. Que no es demasiado perezoso para ocuparse de ello. No puedo probarlo en el Probador de Estrategias porque es multidivisa. Fichero con el código y los indicadores adjuntos al archivo.


He elaborado para usted una única función para crear matrices vinculadas de símbolos y número de órdenes (posiciones abiertas) para comprar y vender, pruebe el script abriendo algunas posiciones en una demo
string Smbl[];
int CntBuy[],CntSell[];
void OnStart()
 {
    if(CountBuySell(Smbl, CntSell, CntBuy))
       for(int i=0; i<ArraySize(Smbl); i++) PrintFormat(" Symbol %s CntBuy %d CntSell %d", Smbl[i], CntBuy[i], CntSell[i]);
 }
//-------------------
bool CountBuySell(string &symb[], int &cnt_sell[], int &cnt_buy[])
{
   int ot,n,N=0,f=0,cb=0,cs=0;
   string symbol;
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         
         ot=OrderType()+1; if(ot>2)  continue;                       // пропускаем лимит ордера
         symbol=""; symbol=OrderSymbol(); if (symbol=="") continue;  // убедились что символ выбран
         f=0; cb=0; cs=0;                                            // обнулили счетчики и флаг символа
         for (n=0; n<N; n++) if (symbol==symb[n]) f=1;               // если в массиве символ OrderSymbol() уже есть, то не будем увеличивать размерность массивов, просто допишем в нижнем цикле еще 1 позицию
         if (f==0)                                                   // такого символа symbol=OrderSymbol() еще не было, увеличим размерность массивов под новый символ и запишем этот символ
         {
            N++; 
            ArrayResize(symb,N); ArrayResize(cnt_buy,N); ArrayResize(cnt_sell,N);
            symb[N-1]=symbol; cnt_buy[N-1]=0.0; cnt_sell[N-1]=0;
         }
         
         if(ot==1) cb++;  // OP_BUY   для выбранного символа
         else      cs++;  // OP_SELL
         
        // перебираем массив и сравним его с выбранным символом. В найденный индекс запишем для данного символа кол-во откр позиций
        // такоим образом для каждого индекса всех 3 массивов будет соответствовать  конкретный символ и количество позиций покупки и продажи для него
         for (n=0; n<N; n++) if (symbol==symb[n]) { cnt_buy[n]+=cb; cnt_sell[n]+=cs;  }
         
      }
   }
   if(N>0) return(1);   // есть открытые позиции
   return(0);           // позиций нет
}
 
evillive:

Estoy tratando de escribir un simple EA que cierre todas las posiciones de mi cuenta cuando alcance los valores especificados de ganancias o pérdidas en la moneda de depósito (abro por varios símbolos), pero cierra las posiciones tan pronto como aparecen (((

No entiendo qué es lo que está mal:



Mira esto.


extern int beneficio = 30;

extern int Magia=0;

int CurProfit;

extern bool CurSymbolOnly = false;


int start() // Función especial start

{

//Contador de beneficios de todos los pedidos

doble p1;

int i1, kk1=Total de pedidos(), pr1=0;

for (i1=0; i1<kk1; i1++)

{

if(OrderSelect(i1, SELECT_BY_POS, MODE_TRADES))

{

if (!CurSymbolOnly || OrderSymbol()==Symbol())

{

p1=MarketInfo(OrderSymbol(), MODE_POINT);

if (p1==0) if (StringFind(OrderSymbol(), Symbol())<0) p1=0.0001; else p1=0.01;

if (OrderType()==OP_BUY)

{

pr1+=NormalizeDouble((OrderClosePrice()-OrderOpenPrice())/p1, 0);

}

if (OrderType()==OP_SELL)

{

pr1+=NormalizeDouble((OrderOpenPrice()-OrderClosePrice())/p1, 0);

}

}

}

}

CurProfit=pr1;

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



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

si (beneficio<=pr1)

{

ClosePosWithMaxProfitInCurrency();

}

return(0);

}

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


///cierra del más caro al más barato

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1)

{

doble pr=0;

int i5, k=OrdersTotal(), np=-1;

if (sy=="0") sy=Símbolo();

for (i5=k-1; i5>=0; i5--)

{

if (OrderSelect(i5, SELECT_BY_POS, MODE_TRADES))

{

si ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op))

{

if (mn<0 || OrderMagicNumber()==mn)

{

si (pr<OrderProfit()+OrderSwap())

{

pr=OrderProfit()+OrderSwap();

np=i5;

}

}

}

}

}

si (np>=0)

{

if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES))

{

{for (int i=OrdersTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;

if (OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),9);

if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),9);

}

}

}

}

closeotlojnie();

}

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


//cerrarotlojnie

void closeotlojnie()

{

for (int i=TotalPedidos()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;

if (OrderType()==OP_BUYSTOP ) OrderDelete(OrderTicket());

if (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket());

if (OrderType()==OP_BUYLIMIT ) OrderDelete(OrderTicket());

if (OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket());

}

}

 
GSB:
He elaborado una función única para que cree matrices vinculadas de símbolos y número de órdenes (posiciones abiertas) de compra y venta, pruebe el script abriendo varias posiciones en una demo


Gracias por su tiempo, pero es un poco complicado para mí, perdón por la intromisión. Explícame qué, dónde y cómo. Como se dice en los dedos.


Nunca he estado acostumbrado a comerciar con este tipo de scripts.

 
GSB, pako, gracias, he estado despistado, no me doy cuenta de esas cosas...
 
denis77515:

Gracias por su tiempo, pero es un poco complicado para mí, perdón por la intromisión. Explícame qué, dónde y cómo. Como se dice en los dedos.


Lo he probado y he operado manualmente en una cuenta demo.


¿Cómo lo has probado en una cuenta demo si sólo hay errores? El código que se presentó no podía comerciar. He añadido comentarios al código. Tienes que hacer todo el trabajo tú mismo, sin conocimientos y sin trabajo... No se puede operar en los mercados, especialmente en el de divisas. El resultado será inequívoco. Además de los problemas mencionados, debe utilizar el sistema de comercio que haya elegido. Después de 2-3 meses los resultados se mostrarán, entonces usted decidirá si este sistema es adecuado para usted personalmente y para el comercio en principio.
 
Gracias, ¡trabajaremos duro!
 
Pregunta a los moderadores o administradores: ¿Puedo cambiar mi apodo? Intenté registrarme en MQL5, pero resultó que mi nick ya estaba utilizado allí, así que tuve que registrarme con otro. Quiero tener el mismo apodo allí y aquí. Por supuesto, puedo volver a registrarme aquí también, pero he empezado a publicar algo en Code Base y quiero mantener la autoría de mis trabajos (y posts) simplemente "cambiando mi nombre". ¿Es posible?
 
Spy:
Pregunta a los moderadores o administradores: ¿Puedo cambiar mi apodo? Intenté registrarme en MQL5, pero resultó que mi nick ya estaba utilizado allí, así que tuve que registrarme con otro. Quiero tener el mismo apodo allí y aquí. Por supuesto, puedo volver a registrarme aquí también, pero he empezado a publicar algo en Code Base y quiero mantener la autoría de mis trabajos (y posts) simplemente "cambiando mi nombre". ¿Es posible?

Escribe a Rosha en un mensaje privado. Espero que la encuentres. Exponer el problema
 

Bien, gracias.

 

Hola! Teniendo EAs en una versión anterior de MetaTrader actualicé el terminal. Después de eso volví al 509. Así que los EA han "estado" en 60... Bild, volvieron a la versión de la terminal en la que se escribieron.

La pregunta es: ¿Qué hacer con los EAs que dejan de abrir operaciones en el Probador de Estrategias después de "volver" y los que ya no se pueden probar (el botón de inicio en el Probador de Estrategias simplemente no responde a un clic)?