Selezionare un simbolo nelle impostazioni - pagina 2

 
Alexey Viktorov:

Stiamo parlando di qualcosa di diverso.

Sì, nel corpo del programma è facile.

E sto parlando della selezione dei parametri per l'ottimizzazione, nella scheda dei parametri del tester...

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

È qui che sarebbe molto comodo avere una lista di simboli da "panoramica del mercato".

Anche lì non devi convertire nulla. Basta dare alla lista pubblica, la lista interna già preparata...

 

aggiunto di più, coppie

 
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:

aggiunto di più, coppie.

Sì, beh, qualcuno ne avrà bisogno)

Ora non resta che sincronizzare la finestra "panoramica del mercato" con questa lista... Credo che tale possibilità sia stata menzionata da qualche parte, se non mi sbaglio.

Ma sarebbe più facile avere una lista pronta!

 
Alexey Viktorov:

Non stiamo parlando della stessa cosa.

Ho incollato il tuo codice - per contare tutte le coppie aperte e sottrarre il lotto corretto. ma penso di essere sciocco qui - forse questo codice non si adatta qui?

 
 

Ma cambia il lotto.

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

Non so se è il tuo codice che fa questo.

Istantanea222

 
Михаил:

Sì, qualcuno ne avrà bisogno).

Ora non resta che sincronizzare la finestra "panoramica del mercato" con questa lista... Credo che questa possibilità sia stata menzionata da qualche parte, se non mi sbaglio.

Ma sarebbe più facile avere una lista pronta!

Questo sarebbe adatto per un tester. creare un Expert Advisor e testarlo con molte coppie

 
Aleksandr Klapatyuk:

Ho incollato il tuo codice - per contare tutte le coppie aperte e sottrarre il lotto corretto. ma penso di essere sciocco qui - forse questo codice non si adatta qui?

Ma cambia il lotto.

Non so se è il tuo codice.



E se fissi il profitto chiudendo i trade? )) Quando il verde si è già allontanato dal blu? Per n-esimo valore? Alla fine può diventare più allegro?

 
Alexey Viktorov:

Non stiamo parlando della stessa cosa.

come usarlo correttamente?

per usarlo, è così.

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;  // Пара

devi fare qualcos'altro per farlo funzionare.

come si usa il tuo codice?

//+------------------------------------------------------------------+
//| 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:

come usarlo correttamente?

Per usarlo in questo modo.

devi fare qualcos'altro per farlo funzionare.

Come si usa il vostro codice?


Riempire un array di caratteri e lavorare con questo array.

Ecco un EA gratuito che usa questo pezzo di codice ***


ps; tumblr, avresti dovuto rimuovere il link per niente. Tra i miei prodotti sul mercato, solo DUE sono a pagamento. Uno del 2017 è stato affittato 4 volte e l'altro del 2014 per 10 sterline non è stato comprato una volta. Quindi non c'è da aspettarsi alcuna pubblicità qui.

 
Alexey Viktorov:

... drubashka, non avresti dovuto cancellare il link....

Dato che i moderatori leggono il forum, possiamo sperare che una tale lista appaia!

 
Alexey Viktorov:

Compila una matrice di caratteri e lavora con questa matrice.

C'è un EA gratuito che usa il pezzo di codice di cui sopra ***


ps; drubashka, non avresti dovuto rimuovere il link. Tra i miei prodotti sul mercato, solo DUE sono a pagamento. Uno del 2017 è stato affittato 4 volte, e l'altro del 2014 per 10 sterline non è stato comprato una volta. Quindi non c'è da aspettarsi alcuna pubblicità qui.

Purtroppo non si può discutere sul forum di nulla del Marketplace, sia a pagamento che gratuito. È stato detto cento volte. Se hai tempo, puoi cercarlo da solo.