Sélectionnez un symbole dans les paramètres - page 2

 
Alexey Viktorov:

Nous parlons de quelque chose de différent.

Oui. Dans le corps du programme, c'est facile.

Et je parle de la sélection des paramètres d'optimisation, dans l'onglet paramètres du testeur...

input  ... это показывает)

C'est là qu'il serait très pratique de disposer d'une liste de symboles provenant de la "vue d'ensemble du marché".

Vous ne devez pas non plus convertir quoi que ce soit. Il suffit de donner à la liste publique, la liste interne déjà préparée...

 

plus, couples

 
enum Enum_Symbol {EURUSD,GBPUSD,USDCHF,USDJPY,USDCAD,AUDUSD,AUDNZD,AUDCAD,AUDCHF,AUDJPY,
                  CHFJPY,EURGBP,EURAUD,EURCHF,EURJPY,EURNZD,EURCAD,GBPCHF,GBPJPY,CADCHF
                 };
//--- Входящие параметры
input  Enum_Symbol     SIMBOL_1                 = EURUSD;         // Пара
input  Enum_Symbol     SIMBOL_2                 = EURUSD;         // Пара
input  Enum_Symbol     SIMBOL_3                 = EURUSD;         // Пара
 
Aleksandr Klapatyuk:

ajouté plus, les couples.

Ouais, eh bien, quelqu'un en aura besoin)

Il ne reste plus qu'à synchroniser la fenêtre "aperçu du marché" avec cette liste... Je pense qu'une telle possibilité a été mentionnée quelque part, si je ne me trompe pas.

Mais ce serait plus facile d'avoir une liste toute prête !

 
Alexey Viktorov:

On ne parle pas de la même chose.

J'ai collé votre code - pour compter toutes les paires ouvertes et soustraire le lot correct. Mais je pense que je suis stupide ici - peut-être que ce code ne convient pas ici ?

 
 

Mais ça change la donne.

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
   string arr[];
   int resize = 0, syTotal = SymbolsTotal(true);
   for(int i = 0; i < syTotal; i++)
     {
      string name = SymbolName(i, true);
      if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
        {
         resize = ArrayResize(arr, i+1);
         arr[i] = name;
        }
      //--- select lot size

      if(!SymbolInfoDouble(arr[i],SYMBOL_ASK,price))
         return(0.0);
      if(!OrderCalcMargin(ORDER_TYPE_BUY,arr[i],1.0,price,margin))
         return(0.0);
      if(margin<=0.0)
         return(0.0);
     }
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int y=orders-1; y>=0; y--)
        {
         ulong ticket=HistoryDealGetTicket(y);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         for(int i = 0; i < syTotal; i++)
           {
            string name = SymbolName(i, true);
            if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
              {
               resize = ArrayResize(arr, i+1);
               arr[i] = name;
              }
            //--- check symbol
            if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=arr[i])
               continue;
            //--- check Expert Magic number
            if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC)
               continue;
            //--- check profit
            double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
            if(profit>0.0)
               break;
            if(profit<0.0)
               losses++;
           }
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
   for(int i = 0; i < syTotal; i++)
     {
      string name = SymbolName(i, true);
      if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
        {
         resize = ArrayResize(arr, i+1);
         arr[i] = name;
        }
      //--- normalize and check limits
      double stepvol=SymbolInfoDouble(arr[i],SYMBOL_VOLUME_STEP);
      lot=stepvol*NormalizeDouble(lot/stepvol,0);
      double minvol=SymbolInfoDouble(arr[i],SYMBOL_VOLUME_MIN);
      if(lot<minvol)
         lot=minvol;
      double maxvol=SymbolInfoDouble(arr[i],SYMBOL_VOLUME_MAX);
      if(lot>maxvol)
         lot=maxvol;
     }
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
 

Je ne sais pas si c'est votre code qui fait ça.

Snapshot222

 
Михаил:

Oui, quelqu'un en aura besoin).

Il ne reste plus qu'à synchroniser la fenêtre "aperçu du marché" avec cette liste... Je pense que cette possibilité a été mentionnée quelque part, si je ne me trompe pas.

Mais ce serait plus facile d'avoir une liste toute prête !

Cela conviendrait à un testeur. Créez un conseiller expert et testez-le avec de nombreuses paires.

 
Aleksandr Klapatyuk:

J'ai collé votre code - pour compter toutes les paires ouvertes et soustraire le lot correct. Mais je pense que je suis stupide ici - peut-être que ce code ne convient pas ici ?

Mais ça change la donne.

Je ne sais pas si c'est votre code.



Et si vous fixiez le profit en fermant des transactions ? )) Quand le vert s'est déjà éloigné du bleu ? Par la n-ième valeur ? À la fin, il peut devenir plus gai ?

 
Alexey Viktorov:

On ne parle pas de la même chose.

comment l'utiliser correctement ?

pour l'utiliser, c'est comme ça.

enum Enum_Symbol {EURUSD,GBPUSD,USDCHF,USDJPY,USDCAD,AUDUSD,AUDNZD,AUDCAD,AUDCHF,AUDJPY,
                  CHFJPY,EURGBP,EURAUD,EURCHF,EURJPY,EURNZD,EURCAD,GBPCHF,GBPJPY,CADCHF
                 };
//--- Входящие параметры
input Enum_Symbol     SIMBOL_1                 = EURUSD;  // Пара
input Enum_Symbol     SIMBOL_2                 = EURUSD;  // Пара
input Enum_Symbol     SIMBOL_3                 = EURUSD;  // Пара

tu dois faire quelque chose d'autre pour que ça marche.

comment utilisons-nous votre code ?

//+------------------------------------------------------------------+
//| function                                                         |
//+------------------------------------------------------------------+
void XXXXXX()
  {
   string arr[];
   int resize = 0, syTotal = SymbolsTotal(true);
   for(int i = 0; i < syTotal; i++)
     {
      string name = SymbolName(i, true);
      if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
        {
         resize = ArrayResize(arr, i+1);
         arr[i] = name;
        }
     };
  };
//+------------------------------------------------------------------+
 
Aleksandr Klapatyuk:

comment l'utiliser correctement ?

Pour l'utiliser comme ça.

tu dois faire quelque chose d'autre pour que ça marche.

Comment utiliser votre code ?


Remplir un tableau de caractères et travailler avec ce tableau.

Voici une EA gratuite utilisant ce morceau de code ***


ps ; tumblr, tu aurais dû enlever le lien pour rien. Parmi mes produits sur le marché, seuls DEUX sont payants. L'un de 2017 a été loué 4 fois et l'autre de 2014 pour 10 livres n'a pas été acheté une seule fois. Il n'y a donc pas de publicité à attendre ici.

 
Alexey Viktorov:

... drubashka, vous n'auriez pas dû supprimer le lien....

Puisque les modérateurs lisent le forum, nous pouvons espérer qu'une telle liste apparaisse !

 
Alexey Viktorov:

Remplissez un tableau de caractères et travaillez avec ce tableau.

Il y a un EA gratuit qui utilise le morceau de code ci-dessus ***


ps ; drubashka, vous n'auriez pas dû supprimer le lien. Parmi mes produits sur le marché, seuls DEUX sont payants. L'un de 2017 a été loué 4 fois, et l'autre de 2014 pour 10 livres n'a pas été acheté une seule fois. Il n'y a donc pas de publicité à attendre ici.

Malheureusement, vous ne pouvez pas discuter sur le forum des produits du marché, qu'ils soient payants ou gratuits. Ça a été dit des centaines de fois. Si vous avez le temps, vous pouvez le rechercher vous-même.