Et faisons-en un "dessin animé" (multidevises) - page 2

 

Vous pouvez modifier légèrement ma fonction pour retourner le nombre total de commandes pour un instrument et un magicien donnés.

 
ALex2008 писал(а) >>

Si vous ne savez pas quoi en faire, vous pouvez demander de l'aide. L'essentiel d'une chose - le faire fonctionner sur plusieurs paires, pas sur une) Et le tester sur une démo n'est pas un problème, juste un mois ou deux, mais le résultat est intéressant)

Formulez la logique du conseiller expert à plusieurs volets, plus elle est détaillée, mieux c'est, et vous n'aurez peut-être pas besoin d'aide.

En règle générale, une compréhension claire de la tâche constitue 90 % de sa réussite.

 
sergeev >> :

Et d'ailleurs, vous avez des erreurs dans votre code ! Beaucoup !

iLow(PERIOD_H4,0,0) - qu'est-ce que c'est ?

Bas de la bougie actuelle))

En effet... ! Comment cela fonctionne-t-il sur le test alors ?

Je ne comprends pas comment je l'ai eu comme ça. Ce devrait être iLow(NULL,PERIOD_H4,0)

 
xeon >> :

Formulez la logique de l'expert multivalent, plus elle est détaillée, mieux c'est, et vous n'aurez peut-être plus besoin d'aide.

En règle générale, une bonne compréhension de la tâche constitue 90 % de sa réussite.

Il n'y a rien de mal à être logique), mais je n'ai pas d'expérience. Je comprends que vous ayez besoin de suivre les commandes par n'importe quel attribut, mais comme je n'ai jamais écrit quelque chose de ce genre auparavant, j'ai peur qu'il n'y ait qu'une seule question... sur les fonctions et leur mise en œuvre)

 
ALex2008 писал(а) >>

Il n'y a rien de mal à la logique) Je suis juste inexpérimenté... Je comprends la nécessité de suivre les commandes par tout attribut, mais comme je n'ai jamais écrit quelque chose de ce genre auparavant, je crains qu'il n'y ait qu'une seule question... sur les fonctions et leur mise en œuvre)

Voir la page précédente pour la fonction

 
Vinin >> :

Voir la fonction à la page précédente

Merci) Je vais essayer de le mettre dans le code)

J'ai commencé à écrire...

#define MAGIC 7779

au lieu de ce -

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

en écrivant ceci -

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

... il échoue - 'Order_Count_Calculate' - la fonction ne renvoie aucun résultat.

Si je comprends bien, la fonction doit trouver tous les ordres du symbole courant Symbol() avec un MAGIC
 
ALex2008 писал(а) >>

Merci) Je vais essayer de le mettre dans le code)

J'ai commencé à écrire...

C'est exactement ce que vous ne voulez pas extern string _Symbol = Symbol() ;

Bien qu'une variable puisse être définie, et qu'il soit préférable d'attribuer une valeur dans inite() ou start()

 
J'ai trébuché à la première fonction...( J'ai compris le but, mais je ne sais pas comment l'utiliser correctement....
 
ALex2008 писал(а) >>

Il n'y a rien de mal à la logique) Je suis juste inexpérimenté... Je comprends la nécessité de suivre les commandes par n'importe quel attribut, mais comme je n'ai jamais écrit quelque chose de ce genre, je crains qu'il n'y ait qu'une seule question... sur les fonctions et leur mise en œuvre)

Eh.... J'ai peur que vous ne compreniez pas...............

la tâche - "je veux qu'il vole", ce n'est pas de la logique - ce qui a volé où il a volé etc. etc.

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

Un bref exemple de la tâche :

Utilisation simultanée de EURUSD, GBPUSD, USDCHF, USDJPY.

Période H1.

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

condition de sélection des paires de devises

Condition d'achat

Condition de réglage SELL

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

Voici un court exemple de mise en œuvre :

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.

Je le pense, si vous pensez à la logique en détail, vous n'aurez aucun problème avec la mise en œuvre.

 
xeon >> :

...Je veux dire que si vous réfléchissez à la logique en détail, vous n'aurez aucun problème de mise en œuvre.

Je vais y penser aujourd'hui... Je sens que j'ai trouvé un mal de tête)) Merci.

Bref, voici un brouillon avec des erreurs... >> corrigez-moi.)

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);}
   }