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

 
Ciao, studiando MQL4 è sorta una piccola domanda. Il problema è riportato nel tutorial su questo sito. Ecco la condizione: Compito 25. Create un programma che realizzi le seguenti condizioni: se il tasso di cambio è salito oltre il livello specificato, allora date un messaggio, in cui le parole indicano che il tasso ha superato il livello (fino a 100 punti); negli altri casi, date un messaggio che il tasso non supera il livello specificato.
Ed ecco la soluzione proposta:
//--------------------------------------------------------------------
extern double Level=1.3200;                     // Заданный уровень 
string Text[101];                               // Объявление массива
//--------------------------------------------------------------------
int init()                                      // Спец. ф-ия init()
  {                                             // Присвоение значений
   Text[1]="один ";            Text[15]="пятнадцать ";
   Text[2]="два ";             Text[16]="шестнадцать ";
   Text[3]="три ";             Text[17]="семнадцать ";
   Text[4]="четыре ";          Text[18]="восемнадцать ";
   Text[5]="пять ";            Text[19]="девятнадцать ";
   Text[6]="шесть ";           Text[20]="двадцать ";
   Text[7]="семь ";            Text[30]="тридцать ";
   Text[8]="восемь ";          Text[40]="сорок ";
   Text[9]="девять ";          Text[50]="пятьдесят ";
   Text[10]="десять ";         Text[60]="шестьдесят";
   Text[11]="одиннадцать ";    Text[70]="семьдесят ";
   Text[12]="двенадцать ";     Text[80]="восемьдесят ";
   Text[13]="тринадцать ";     Text[90]="девяносто";
   Text[14]="четырнадцать ";   Text[100]= "сто";
   // Вычисление значений
   for(int i=20; i<=90; i=i+10)                // Цикл по десяткам
     {
      for(int j=1; j<=9; j++)                  // Цикл по единицам
         Text[i+j]=Text[i] + Text[j];          // Вычисление значения   
     }
   return;                                     // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. ф-ия start()
  {
   int Delta=NormalizeDouble((Bid-Level)/Point,0);// Превышение 
//--------------------------------------------------------------------
   if (Delta>=0)                                // Цена не выше уровня
     {
      Alert("Цена ниже уровня");                // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   if (Delta<100)                               // Цена более 100
     {
      Alert("Более ста пунктов");               // Сообщение
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------------
   Alert("Плюс ",Text[Delta],"pt.");            // Вывод на экран
   return;                                      // Выход из start()
  }
//---------------------------------------------------------------------
По-моему в условных операторах неправильно проставлены знаки сравнения. Они должны быть с точностью до наоборот. Скажите прав ли я? И если нет, то почему так?  
 
Step:
Ciao, ho una piccola domanda mentre studio MQL4. Il problema si trova nel tutorial su questo sito. Ecco la condizione: Problema 25. Creare un programma in cui si realizzano le seguenti condizioni: se il tasso supera il livello specificato, emette un messaggio in cui le parole indicano che il tasso supera il livello (fino a 100 punti); negli altri casi, il messaggio informa che il tasso non supera il livello specificato.
Ed ecco la soluzione proposta:


Mostra le possibili soluzioni. Utile per la formazione.

Ci sono altre opzioni. Ci sono altri errori.

Fidati di più di te stesso. Esperimento.

 
Step:
Ciao, studiando MQL4 ho una piccola domanda. Il compito si trova nel tutorial su questo sito. Ecco la condizione: Problema 25. Creare un programma che realizzi le seguenti condizioni: se il tasso supera il livello specificato, emette un messaggio che dice che il tasso supera il livello (fino a 100 punti); negli altri casi, il messaggio che dice che il tasso non supera il livello specificato.
Ed ecco la soluzione proposta:


P.S.

In particolare, l'utilità di questo esempio nel trattare un array,

la possibile rappresentazione dei dati in parole,

l'uso della funzione NormalizeDouble e la variabile predefinita Point.

Possibilità di scegliere un hobby più facile.

 

Apparentemente, non c'è modo di dichiarare variabili esterne direttamente nella classe. Allora quali sono le opzioni? Se non voglio dichiarare nello stesso Expert Advisor o da qualche altra parte queste variabili esterne specifiche, che sono necessarie solo quando si usa questa classe. Penso che l'unica opzione sia fare un inluder che dichiari queste variabili esterne. E poi la classe dovrebbe esservi inclusa, giusto?

Poi, per chiamare la classe, è necessario includere la classe stessa. È così? O ci possono essere altre varianti?

Semplicemente non mi sembra buono. Un sacco di file di inclusione annidati da creare... Ecco perché ho questa domanda.

O è ancora possibile, come in una normale libreria, dichiarare variabili esterne e importare le librerie richieste prima di dichiarare la classe? Intendo qualcosa del genere:

// Объявляем внешние переменные
extern type Var1;
extern type Var2;
extern type Var3;

// Подключаем требуемые библиотеки
//#include <LBase.mqh>
//+---
//#include <Logging.mqh>
#import "user32.dll"
     int GetAncestor;
     int PostMessageA;
#import
//
class CLogging
{
   protected:
 // защищенные данные
   public:
 // открытые данные
};
Non l'ho mai visto prima. Quindi mi chiedo se sto andando nella direzione giusta...
 
Trasferendo il codice dell'indicatore all'Expert Advisor, si verifica un errore. Le ho emesse come variabili globali nello schermo del terminale tramite Comment.

if(BullBear!="")
{
retXB=(zz[A4]-zz[B4])/(zz[A4]-zz[X4]+0.000001);
retAC=(zz[C4]-zz[B4])/(zz[A4]-zz[B4]+0.000001);



Emettetele come variabili globali sullo schermo del terminale attraverso Comment. Non c'erano zeri, solo numeri negativi. Poi ho cambiato

//---- indicator buffers
double zz[1500];
a

//---- indicator buffers
double zz[300];
tutto è andato al suo posto e l'ha rimesso a posto. Nessun errore! Qual era il motivo? Ho anche spento internet.
 
semargl988:

Trasferendo il codice dell'indicatore all'Expert Advisor, si verifica un errore. Dividere a zero nella parte di codice

...

Emettetele come variabili globali sullo schermo del terminale tramite Comment. Non c'erano zeri, solo numeri negativi. Poi ho cambiato

...

a .

...

tutto è andato a posto e l'ha rimesso a posto. Nessun errore! Qual è stata la causa? Ho spento di nuovo internet.

Ho anche ottenuto l'errore "zero divide" dove lo zero non poteva essere passato nel denominatore della frazione. Ora, prima di dividere, faccio un controllo formale come:

if(znamenatel==0)
{
 какое-то действие;
}

E l'errore è scomparso. Cioè il compilatore dovrebbe essere istruito su cosa fare se denominatore=0 anche se il programmatore è sicuro al 100% che non ci sia lo 0.

 

Ciao, puoi aiutarmi con il codice? Ho bisogno che l'EA faccia la cosa elementare - aprire posizioni quando si avvicina alla linea verticale (cioè rigorosamente il tempo, non il prezzo), cioè per un intervallo di shi specificato, che ho qui 120 cioè come ho capito - 2 minuti. Il colore della linea dovrebbe determinare se è comprare o vendere. Ho cercato in Internet e l'ho riscritto e ho ottenuto quanto segue:

void OnTick()
{
int AllObject = ObjectsTotal();
for ( int i = 0; i < AllObject; i++)
{

string NameObj = ObjectName(i);
Colorrr = ObjectGet(NameObj, OBJPROP_COLOR);
Vremyaaa = (ObjectGet(NameObj, OBJPROP_TIME) - shi);
if(Vremyaaa == TimeLocal())
break;
}

int kolpos = 0;

if((Colorrr == Green)||(Colorrr == Aqua)){operacia = "OP_BUY";}
if((Colorrr == Red)||(Colorrr == Purple)){operacia = "OP_SELL";}
for (int pos = 0; pos < OrdersTotal(); pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
kolpos++;
}
}
}
if(kolpos == 0)
{
if (iTime(NULL,0,1) == Vremyaaa)
{
int ticket = OrderSend(Symbol(), operacia, Lot, Bid, 10, 0, 0, "5", Magic, 0, col);
}

}

}

Non scambia per qualche motivo. Non scrive nessun errore nel log...
 
dmitriyriy666:

Ciao, puoi aiutarmi con il codice? Ho bisogno che l'EA faccia la cosa elementare - aprire posizioni quando si avvicina alla linea verticale (cioè rigorosamente il tempo, non il prezzo), cioè per un intervallo di shi specificato, che ho qui 120 cioè come ho capito - 2 minuti. Il colore della linea dovrebbe determinare se è comprare o vendere. Ho cercato in Internet e l'ho riscritto:

void OnTick()
{
int AllObject = ObjectsTotal();
for ( int i = 0; i < AllObject; i++)
{

string NameObj = ObjectName(i);
Colorrr = ObjectGet(NameObj, OBJPROP_COLOR);
Vremyaaa = (ObjectGet(NameObj, OBJPROP_TIME) - shi);
if(Vremyaaa == TimeLocal())
break;
}

int kolpos = 0;

if((Colorrr == Green)||(Colorrr == Aqua)){operacia = "OP_BUY";}
if((Colorrr == Red)||(Colorrr == Purple)){operacia = "OP_SELL";}
for (int pos = 0; pos < OrdersTotal(); pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
kolpos++;
}
}
}
if(kolpos == 0)
{
if (iTime(NULL,0,1) == Vremyaaa)
{
int ticket = OrderSend(Symbol(), operacia, Lot, Bid, 10, 0, 0, "5", Magic, 0, col);
}

}

}

Il codice non scambia per qualche motivo. Non registra alcun errore...

Se il vostro tempo coincide con quello del terminale, potete usare TimeLocal(), ma TimeCurrent() è più affidabile .

Cambiare il tipo di variabile operacia in int e rimuovere le virgolette OP_BUY e OP_SELL

 
AlexeyVik:

Se avete lo stesso tempo del tempo del terminale, potete usare TimeLocal(), ma TimeCurrent() è più affidabile .

Cambiare il tipo di variabile operacia in int e rimuovere le virgolette OP_BUY e OP_SELL



Grazie. Riguardo a TimeCurrent è vero, il mio tempo non corrisponde a quello del server. Risolto, ma ancora non funziona... Non scrive alcun errore nel log.


P.S. Nel mio post precedente, il codice senza spazi è stato inserito in qualche modo. Ma penso di aver messo tutte le parentesi graffe correttamente.

 

MT4 - 625, messaggio del tester quando si cerca di testare i gufi con la libreria:

2014.03.29 18:38:48.753 'C:\Program Files\Admiral1\MQL4\Libraries\ingLib094.mq4' non è la versione a 32 bit

Prima che il gufo si compilasse senza problemi, e anche la biblioteca non aveva una sola parola. In effetti, non lo capisco affatto.

Il mio sistema (intendo Windows) è a 32 bit, non ne ho mai avuto un altro. Settimo.

La biblioteca è la mia nativa, tutta la strada con essa. Va bene in tempo reale sulla nuova costruzione. Anche con altri gufi. E in tester nelle versioni precedenti senza problemi.

Ma non vuole aprirsi in tester, e la ragione viene addirittura risucchiata dalle dita.

E non c'è una parola sui casi a 32 bit in tutti i manuali.