[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 935

 

Ciao, sono interessato a questa domanda. Alpari fornisce un server dove puoi caricare il tuo consulente in modo che possa lavorare 24 ore su 24? Sarebbe così gentile da rispondere di persona?

 
gheka:

Non funziona, forse devo cambiare qualcosa qui o metterlo dopo l'inizio.

Ho provato a tradurre il tuo codice su carta in russo che capisco, ma non funziona,

è troppo complicato, soprattutto quando le condizioni di ogni condizione si susseguono, e una condizione su otto condizioni.

Naturalmente non discuto che chi ha creato questo codice sia un miracolo, ma per me è una perversione completa (in senso buono)

Non sono pigro per aggiungere commenti ad ogni operazione e condizione, tranne che per la funzione standard.


C'è qualche ridondanza nel codice, ma il codice è leggibile

 
domanda sul cambio di periodo nel programma ... per esempio c'è una certa sequenza di operatori che deve essere applicata a diversi periodi ... come ho capito è più facile fare questo sotto forma di un ciclo ... cambiando il periodo... Ho trovato una funzione nella documentazione che restituisce il valore del periodo ... ma non riesco a trovare una funzione per cambiarlo ... cosa sto sbagliando?
 

Qualcosa non funziona per te, non questo codice... :)

bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {// Объявление функции. Передаваемые параметры: sy = символ, op - тип, mn - магик
  datetime t;                                                  // Переменная содержит время закрытия ордера
  double   ocp, osl;                                           // ocp - цена закрытия позиции, osl - цена СтопЛосс закрытой позиции
  int      dg, i, j=-1, k=OrdersHistoryTotal();                // k содержит общее количество ордеров в истории

  if (sy=="0") sy=Symbol();                                 // Если в ф-цию передан sy равный 0 или NULL, то использовать символ графика
  for (i=0; i<k; i++) {                                     // Цикл по массиву закрытых ордеров
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {      // Если выбран ордер из массива закрытых ордеров, ...
      if (OrderSymbol()==sy || sy=="") {                    // ... если его символ совпадает с нашим, ...
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {  // ... если его тип Бай или Селл, ...
          if (op<0 || OrderType()==op) {                // ... если тип ордера равен или -1 (имеется ввиду любой) или равен переданному в ф-цию, ...
            if (mn<0 || OrderMagicNumber()==mn) {       // ... если его магик или любой (-1) или равен переданному в ф-цию (магику советника), ...
              if (t<OrderCloseTime()) {    // ... если переменная t содержит время закрытия меньше, чем время закрытия выбранного ордера, то ...
                t=OrderCloseTime();        // ... то присвоим переменной t время закрытия выбранного ордера (этот ордер закрыт позже предыдущего)
                j=i;                                        // Запишем в переменную j индекс найденного ордера с максимальным временем закрытия
              }
            }
          }
        }
      }
    }
  }                                                       // По окончании цикла в переменной j находится индекс последнего закрытого ордера
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {      // Выберем его по индексу
    dg=MarketInfo(sy, MODE_DIGITS);                       // Количество цифр после десятичного точки в цене инструмента, заданного переменной sy
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2; // Честно... точно не скажу, но вижу, что корректировка под йену
    ocp=NormalizeDouble(OrderClosePrice(), dg);           // Нормализуем цену закрытия ордера для дальнейшего сравнения с ценой СтопЛосс
    osl=NormalizeDouble(OrderStopLoss(), dg);             // Нормализуем цену СтопЛосс ордера для сравнения с ценой закрытия
    if (ocp==osl) return(True);                           // Если эти цены равны, значит поза закрыта по стопу, возвращаем значение "Истина"
  }
  return(False);                                          // Возвращаем "Ложь"
}

Questa è tutta la logica... Viktor aveva ragione - è ridondante, ma il più semplice possibile... :)

 
Skopcheny:
domanda su come cambiare il periodo nel programma ... per esempio c'è una certa sequenza di operatori che dovrebbero essere applicati a diversi periodi ... come ho capito è più facile farlo sotto forma di una linea temporale ... cambiando il periodo... Ho trovato una funzione nella documentazione che restituisce un valore di periodo... ma non riesco a trovare una funzione per cambiarlo... dove sbaglio?

Il periodo del grafico può essere uno qualsiasi dei seguenti valori:

Costante Valore Descrizione
PERIODO_M1 1 1 minuto
PERIODO_M5 5 5 minuti
PERIODO_M15 15 15 minuti
PERIODO_M30 30 30 minuti
PERIODO_H1 60 1 ora
PERIODO_H4 240 4 ore
PERIODO_D1 1440 1 giorno
PERIODO_W1 10080 1 settimana
PERIODO_MN1 43200 1 mese
0 (zero) 0 Periodo del grafico corrente
 
Grazie mille, ho solo bisogno di alcuni chiarimenti ... per un gruppo di operatori per lavorare su un certo periodo è sufficiente specificare uno dei periodi davanti a loro come sono presentati in questa tabella?
 
Skopcheny:
Grazie mille, ho solo bisogno di alcuni chiarimenti ... per un gruppo di operatori per lavorare su un certo periodo è sufficiente specificare uno dei periodi davanti a loro come sono presentati in questa tabella?
Per rispondere correttamente alla tua domanda, è necessario vedere almeno un esempio di codice in cui è necessario specificare il periodo...
 
artmedia70:
Per dare la risposta giusta alla tua domanda, è necessario vedere almeno un codice di esempio dove si deve specificatamente impostare il periodo...


string trend()
{int count,count_change;
double bar_centr;
string trend;
bool clear;
for (int i=10;i!=0;i--)
{
bar_centr = (High[i]-Low[i])/2+Low[i]);
if (bar_centr>((High[i+1]-Low[i+1])/2+Low[i+1])
count++;

if (bar_centr<((High[i+1]-Low[i+1])/2+Low[i+1])
count--;
}

Print (count, "period ",Period());


if (count>3) trend="buy";
if (count<-3) trend="sell";
if (count<3||count>-3) trend="uncertain";





return(trend);}

questa funzione deve essere applicata una dopo l'altra a diversi periodi ... Funziona se lo collego a windows nel terminale con diversi intervalli di tempo ... La domanda è se è possibile per EA gestire diversi periodi...

 
Skopcheny:


questa funzione deve essere applicata successivamente a diversi periodi ... Funziona se collego l'EA a windows nel terminale con diversi periodi ... La domanda è se è possibile per EA gestire diversi periodi...

Capisco che tu voglia che la tua funzione lavori non solo con il grafico e il periodo correnti, ma con qualsiasi periodo che le è stato passato...

string trend(string sy="", int tf=0)
{
   int count,count_change;
   double bar_centr;
   string trend;
   bool clear;

   if (sy=="" || sy=="0") sy=Symbol();      
   if (tf==0) tf=Period();
   
   for (int i=10; i>0; i--)
      {
         bar_centr = (iHigh(sy,tf,i)-iLow(sy,tf,i))/2+iLow(sy,tf,i);
         if (bar_centr>((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tf,i+1)))
            count++;
         if (bar_centr<((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tfi+1)))
            count--;
      }

   Print (count,"период ",tf);

   if (count>3) trend="покупка";
   if (count<-3) trend="продажа";
   if (count<3||count>-3) trend="неопределенность";

   return(trend);
}

Ora, chiamate la vostra funzione in questo modo

trend(Symbol(), Period()); // Restituirà i valori del grafico e del periodo in cui l'EA è in bilico...

trend(USDJPY, PERIOD_D1); // Restituisce i valori per il simbolo USDJPY e il periodo di "1 giorno".

Invece di PERIOD_D1 potete inserire 1440 - darà lo stesso risultato...

Se viene chiamata senza parametri, la funzione restituisce i valori per il simbolo corrente e il periodo (sono impostati di default)

 
artmedia70:

Capisco che tu voglia che la funzione lavori non solo con il grafico e il periodo correnti, ma con qualsiasi grafico passato ad essa...

Ora chiamate la vostra funzione in questo modo:

trend(Symbol(), Period()); // Restituirà i valori del grafico e del periodo in cui l'EA è in bilico...

trend(USDJPY, PERIOD_D1); // Restituisce i valori per il simbolo USDJPY e il periodo di "1 giorno".

Invece di PERIOD_D1 potete inserire 1440 - è lo stesso...




risposta esauriente... grazie mille ...
Motivazione: