Y hagamos una "caricatura" de ello (multidivisa) - página 2

 

Puedes modificar ligeramente mi función para que devuelva el número total de pedidos para un instrumento y un mago determinados.

 
ALex2008 писал(а) >>

Si no sabes qué hacer con él, puedes pedir ayuda. La esencia de una cosa - para que funcione en varios pares, no en uno) Y para probarlo en una demo no es un problema, sólo un mes o dos, pero el resultado es interesante)

Formule la lógica del Asesor Experto múltiple, cuanto más detallada sea, mejor, y quizás no necesite ayuda.

Por regla general, la comprensión clara de la tarea es el 90% de su éxito.

 
sergeev >> :

Y por cierto, ¡tienes errores en tu código! ¡Muchos!

iLow(PERIOD_H4,0,0) - ¿Qué es esto?

mínimo de la vela actual))

En efecto... ¿Cómo funciona entonces en la prueba?

No entiendo cómo lo tengo así. Debería ser iLow(NULL,PERIOD_H4,0)

 
xeon >> :

Formule la lógica del experto multivalente, cuanto más detallada, mejor, y puede que no necesite más ayuda.

Por regla general, una comprensión clara de la tarea es el 90% de su éxito.

No hay nada malo en la lógica) sólo que no tengo experiencia. Entiendo que hay que hacer un seguimiento de los pedidos por cualquier atributo, pero como nunca he escrito nada parecido antes me temo que sólo habrá una pregunta... sobre las funciones y su aplicación)

 
ALex2008 писал(а) >>

No hay nada malo en la lógica) Sólo soy inexperto... Entiendo la necesidad de rastrear los pedidos por cualquier atributo, pero como nunca he escrito algo así antes me temo que sólo habrá una pregunta... sobre las funciones y su aplicación)

Consulte la página anterior para ver el funcionamiento

 
Vinin >> :

Mira la función en la página anterior

Gracias) Intentaré ponerlo en el código)

Empezó a escribir...

#define MAGIC 7779

en lugar de esto -

   if(OrdersTotal()==0){
      mod=false;
      SetOrders();}

escribiendo esto -

   if( Order_Count_Calculate(Symbol(), MAGIC)==0){
      mod=false;
      SetOrders();}

... falla - 'Order_Count_Calculate' - la función no devuelve ningún resultado

Si he entendido bien, la función debería encontrar todas las órdenes del símbolo actual Symbol() con un MAGIC
 
ALex2008 писал(а) >>

Gracias) Intentaré ponerlo en el código)

Empezó a escribir...

Esto es exactamente lo que no quieres extern string _Symbol = Symbol();

Aunque se puede definir una variable, y es mejor asignar un valor en inite() o start()

 
Me he tropezado con la primera función...( entiendo el punto, pero no sé cómo usarlo correctamente...
 
ALex2008 писал(а) >>

No hay nada malo en la lógica) Sólo soy inexperto... Entiendo la necesidad de rastrear los pedidos por cualquier atributo, pero como nunca he escrito algo así antes me temo que sólo habrá una pregunta... sobre las funciones y su aplicación)

Eh.... Me temo que no entiendes..............

la tarea - "quiero que vuele", no es lógica - lo que voló donde voló etc. etc.

--------------------------------------------

Un breve ejemplo de la tarea:

Uso simultáneo de EURUSD, GBPUSD, USDCHF, USDJPY.

Período H1.

......................

condición de selección del par de divisas

Condición de compra

Condición de ajuste SELL

.......................

He aquí un breve ejemplo de aplicación:

int MAGIC = 322223;
string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать
int start(){
   
   int s = SymbolSelect();                   //Функция выбора валютной пары
   if( SelectOrder( Sym[ s],OP_BUY, MAGIC)<0){   //Если нет установленного ордера по выбранному символу
      UpTrend( Sym[ s]);                       //Проверим условие установки ордера 
   }
   if( SelectOrder( Sym[ s],OP_SELL, MAGIC)<0){  //Если нет установленного ордера по выбранному символу
      DownTrend( Sym[ s]);                     //Проверим условие установки ордера 
   }

}


int SymbolSelect(){
  int s=-1;
  //Условие выбора валютной пары для работы  
   
  return( s)
}
    //+-------------------Выбор ордера---------------------------+
int SelectOrder(string Sym,int Tip,int MAGIC){
    int TotOrd=OrdersTotal();
    int OrdTick=-1;
    for(int OrdPos= TotOrd-1; OrdPos>=0; OrdPos--){
        if(OrderSelect( OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
           if(OrderSymbol()== Sym){                                           //Есть ли ордера с нужным символом
              if(OrderType()== Tip){                                          //Если нужный тип ордера  
                 if( MAGIC==0){ MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                 if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                    OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
    }}}}}
    return( OrdTick);                                                         //Возвращает тикет найденного ордера или -1
}
bool UpTrend(string Sym){
     //Условие установки BUY ордера
}
bool DownTrend(string Sym){
    //Условие установки SELL ордера
}

etc.

Es decir, si piensas en la lógica en detalle, no tendrás ningún problema con la implementación.

 
xeon >> :

...eso es lo que quiero decir, si piensas en la lógica en detalle, no tendrás ningún problema con la implementación.

Voy a pensar en ello hoy... Siento que he encontrado un dolor de cabeza)) Gracias.

De todos modos, aquí hay un borrador con errores... >> corrígeme).

extern double Profit = 3000;

int MAGIC = 322223;

string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать

double b0, b1, s0, s1, StopLoss, Enter;
bool dwnSym, upSym, mod;

int init(){ Profit*=Point;
}

int start()
{
   
      int s = SymbolSelect();                      //Функция выбора валютной пары
      if( SelectOrder( Sym[ s],OP_BUYSTOP, MAGIC)<0){  //Если нет установленного ордера по выбранному символу
         UpTrend( Sym[ s]);                          //Проверим условие установки ордера 
         }
      if( SelectOrder( Sym[ s],OP_SELLSTOP, MAGIC)<0){ //Если нет установленного ордера по выбранному символу
         DownTrend( Sym[ s]);                        //Проверим условие установки ордера 
         }
      
      
      if( SelectOrder( Sym[ s],OP_BUYSTOP, MAGIC)>0 && AccountProfit()&& (! mod)){  //Если установлен ордер по выбранному символу
         SetStopBuy( Sym[ s]);                                                  //и он открылся, ставим стоп
         }
      if( SelectOrder( Sym[ s],OP_SELLSTOP, MAGIC)>0 && AccountProfit()&& (! mod)){ //Если установлен ордер по выбранному символу
         SetStopSell( Sym[ s]);                                                 //и он открылся, ставим стоп
         }
}

   int SymbolSelect(){
   int s=-1;
   return( s);}
   
//+-------------------Выбор ордера---------------------------+
   int SelectOrder(string Sym,int Tip,int MAGIC){
      int TotOrd=OrdersTotal();
      int OrdTick=-1;
      for(int OrdPos= TotOrd-1; OrdPos>=0; OrdPos--){
         if(OrderSelect( OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
            if(OrderSymbol()== Sym){                                           //Есть ли ордера с нужным символом
               if(OrderType()== Tip){                                          //Если нужный тип ордера  
                  if( MAGIC==0){ MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                  if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                     OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
      }}}}}
    return( OrdTick);}                                                         //Возвращает тикет найденного ордера или -1


//Условие и установка BUY ордера
   bool UpTrend(string Sym){
       
       if((iOpen( Sym,PERIOD_H4,1) - iClose( Sym,PERIOD_H4,1) <= 0) &&
         (iOpen( Sym,PERIOD_H4,2) - iClose( Sym,PERIOD_H4,2) > 0)){
          upSym=false;
          dwnSym=true;
          CloseOpenOrdersAndCancelPending();
          double Enter=iHigh( Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
          OrderSend( Sym, OP_BUYSTOP, 0.1, Enter, 0, 0, Ask+ Profit, 0, 0,0, Green);}
   }

//Условие и установка SELL ордера
   bool DownTrend(string Sym){
       
       if((iOpen( Sym,PERIOD_H4,1) - iClose( Sym,PERIOD_H4,1) >= 0) &&
         (iOpen( Sym,PERIOD_H4,2) - iClose( Sym,PERIOD_H4,2) < 0)){
          upSym=true;
          dwnSym=false;
          CloseOpenOrdersAndCancelPending();
          double Enter=iLow( Sym,PERIOD_H4,1)-10*Point;
          OrderSend( Sym, OP_SELLSTOP, 0.1, Enter, 0, 0, Bid- Profit, 0, 0,0, Green);}
         
   }
   
//-------Вычисление и утановка стопа для бай
void SetStopBuy(string Sym)
   {
      RefreshRates();
      double b0=iLow( Sym,PERIOD_H4,0)-10*Point;
      double b1=iLow( Sym,PERIOD_H4,1)-10*Point;
      
            if( b0< b1) StopLoss= b1;
            else StopLoss= b0;
            RefreshRates();
            mod=OrderModify( OrdTick,OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
   } 
   
 //-------Вычисление и утановка стопа для сел
void SetStopSell(string Sym)
   {
      RefreshRates();
      double s0=iHigh( Sym,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      double s1=iHigh( Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      
            if( s0< s1) StopLoss= s0;
            else StopLoss= s1;
            RefreshRates();
            mod=OrderModify( OrdTick,OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
   }
   
void CloseOpenOrdersAndCancelPending()
   {
      for (int i=OrdersTotal()-1; i>=0; i--){
      if (!OrderSelect( i, SELECT_BY_POS))  continue;
      if (OrderSymbol()!= Sym)        continue;
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10);}
   }
Razón de la queja: