Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 386

 
alexey1979621:
Grazie, ho smontato il tuo codice. C'è effettivamente un errore all'apertura (il mio occhio è già fradicio). Ho messo l'EA modificato in una demo dove ci sono già posizioni aperte sul nostro Meijic con totale profitto positivo. Tuttavia, la posizione non è stata chiusa.

Vedo che nel nuovo codice (che è sotto nel post) il parametro di default passato alla funzione è cambiato:

int NumberOfPositions(string sy="", int op=-1, int mn=1114)

La versione originale aveva una Magik diversa. Ho corretto il riferimento a questa funzione nel mio codice. Guarda sotto quali ordini Magik sono aperti ora e imposta questo numero di Magik nel tuo EA.

P.S. E usare codifiche diverse quando si nominano le variabili non è un segno di buona forma... Voglio dire:

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


Guarda questa linea

else if (order_type = OP_SELL()

E questo.

if (order_type = OP_BUY)
 
TarasBY:

Vedo che nel nuovo codice (che è sotto nel post) il parametro di default passato alla funzione è cambiato:

La versione originale aveva una Magik diversa. Ho corretto il riferimento a questa funzione nel mio codice. Guarda sotto quale Magik gli ordini sono aperti ora e metti questo numero di Magik nel tuo EA.


No, il magik è corretto, quello per EURAUDUSD è 1111 e quello per EURUSD_GBPUSD è 1114 (un'altra persona mi ha aiutato a correggerlo). Entrambi gli scambi non si chiudono. Sto guardando i profitti totali di EURUSD_GBPUSD, ma il mio Expert Advisor non riesce a chiuderlo. Ho rivisto la tua versione per EURAUD_AUDUSD - 1111 per EURUSD_GBPUSD - 1114, ancora non chiude le operazioni. La caratteristica del gufo è che non è possibile testarlo nel tester (perché due coppie sono scambiate) - solo su una demo.
 
alexey1979621:

No, il mage è corretto, quello per EURAUD_AUDUSD è 1111 e quello per EURUSD_GBPUSD è 1114 (un'altra persona mi ha aiutato a correggerlo). Entrambi gli scambi non si chiudono. Sto guardando i profitti totali di EURUSD_GBPUSD, ma il mio Expert Advisor non riesce a chiuderlo. Ho rivisto la tua versione per EURAUD_AUDUSD - 1111 per EURUSD_GBPUSD - 1114, ancora non chiude le operazioni. La caratteristica del gufo è che non è possibile testarlo nel tester (perché due coppie sono scambiate) - solo su una demo.


Facciamo qualche cambiamento. Invece di

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

mettere

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
eseguire l'EA, impostare il profitto a zero e vedere cosa è uscito e cosa c'è nei log.
 
Roger:


Guarda questa linea

else if (order_type = OP_SELL()


grazie!)
 
alexey1979621:

No secondo il majik tutto è corretto, quello per EURAUD_AUDUSD è 1111 e quello per EURUSD_GBPUSD è 1114 (un'altra persona ha aiutato a sistemarlo). Entrambi gli scambi non si chiudono. Sto guardando i profitti totali di EURUSD_GBPUSD, ma il mio Expert Advisor non riesce a chiuderlo. Ho rivisto la tua versione per EURAUD_AUDUSD - 1111 per EURUSD_GBPUSD - 1114, ancora non chiude le operazioni. La caratteristica del gufo è che non posso testarlo nel tester (perché due coppie sono scambiate) - solo su una demo.

In primo luogo, non state affrontando correttamente l'indicatore. Questo indicatore ha molti parametri esterni:

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

e devono essere elencati quando si chiama l'indicatore. Se li ometti, i parametri saranno presi per default, e dato che vuoi usarlo per diverse coppie di valute, questa opzione non è adatta. E tutto il resto può essere fatto tenendo conto dei cambiamenti dei parametri all'inizio dell'EA:

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  int i, k=OrdersTotal(), kp=0;
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
//+------------------------------------------------------------------+

Leggi qui la chiamata dell'indicatore.

 
Roger:


Facciamo qualche cambiamento. Invece di

mettere

eseguire l'EA, impostare il profitto a zero e vedere cosa è uscito e cosa c'è nei log.


Il risultato è brutto. Con le tue modifiche e il profitto uguale a 0, l'Expert Advisor ha chiuso tutte le posizioni su Meijic 1111, 1112, 1113, 1114, 1115. Poi, dopo 5 secondi, sono stati aperti nuovi ordini per questi simboli Meijic e dopo 10 secondi, sono stati tutti chiusi e la stessa cosa è successa di nuovo. Le posizioni non sono state aperte a coppie, ma in modo caotico.
 
alexey1979621:

Questo si è rivelato spaventoso. Con le tue modifiche e il profitto uguale a 0, l'EA ha chiuso tutte le posizioni su Majic 1111, 1112, 1113, 1114, 1115 a tutti. Poi, dopo 5 secondi, sono stati aperti nuovi ordini per questi simboli Meijic e dopo 10 secondi, sono stati tutti chiusi e la stessa cosa è successa di nuovo. Le posizioni non sono state aperte a coppie, ma in modo caotico.


La mia domanda guida è: quanti EAs hai in questo conto?

E tu avevi una condizione: chiudere tutti gli ordini in profitto.

PS Hai visto il trabocchetto che hai con questo EA - continuerà ad aprire ordini dopo la chiusura, che alla fine porterà ad una perdita. Quindi devi mettere una bandiera che proibisca di piazzare nuovi ordini fino a quando le condizioni non passano e si ripresentano.

 
TarasBY:

In primo luogo, non state affrontando correttamente l'indicatore. Questo indicatore ha molti parametri esterni:

e devono essere elencati quando si chiama l'indicatore. Se li ometti, i parametri saranno presi per default, e dato che vuoi usarlo per diverse coppie di valute, questa opzione non è adatta. E tutto il resto può essere fatto considerando i cambiamenti dei parametri all'inizio dell'EA:

Potete leggere come chiamare l'indicatore qui.

Grazie. So della chiamata dell'indicatore. Ma i parametri regolabili dell'indicatore dovrebbero essere elencati quando li applichiamo in test o in funzione. Dato che questo EA non può essere testato nel tester (perché vengono scambiate due coppie), è impossibile scegliere questi parametri sullo storico. La tua ultima variante è già stata implementata in una demo. Vedrò come si chiuderanno i trade. Un'altra piccola domanda, per due strumenti i trade si aprono o in Buy o in Sell. Se abbiamo bisogno di aprire in Sell per uno strumento e in Buy per un altro, come dovremmo aprirlo? Ho cercato in giro, senza fortuna ..... Ancora una volta grazie mille per il vostro duro lavoro.
 
Roger:


La mia domanda guida è: quanti EAs hai in questo conto?

E tu avevi una condizione: chiudere tutti gli ordini in profitto.

PS Hai visto il trabocchetto che hai con questo EA - continuerà ad aprire ordini dopo la chiusura, che alla fine porterà ad una perdita. Quindi devi mettere una bandiera che proibisca di piazzare nuovi ordini fino a quando le condizioni non passano e si ripresentano.


C'erano 5 Expert Advisors al lavoro (fratelli gemelli - per coppie diverse), naturalmente con Meijic diversi.


Sì, avevamo la condizione di profitto per chiudere gli ordini ma gli ordini erano legati a un certo EA, per esempio, con MAJIC 1114. L'ho scritto fin dall'inizio e credevo che il gufo non vedesse i propri ordini alla chiusura; si scopre che vede tutti gli ordini e vuole tanto chiuderli ma non ci servono tutti ma alcuni specifici.

Se prendiamo il periodo H4, quando le linee dell'indicatore sono superiori a 0.1 e inferiori a -0.1, la condizione è soddisfatta e le operazioni vengono aperte, cioè è possibile prendere diversi profitti in un solo segnale (anche se c'è un'opzione per chiudere le operazioni quando le linee dell'indicatore convergono).