Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 569

 
Olá! Ao estudar a MQL4 surgiu uma pequena pergunta. O problema está publicado no tutorial deste site. Aqui está a condição: Tarefa 25. Criar um programa, no qual se realizem as seguintes condições: se a taxa de câmbio tiver subido acima do nível especificado, então dê uma mensagem, na qual palavras indicam que a taxa excede o nível (até 100 pontos); em outros casos, para informar que a taxa não excede o nível especificado.
E aqui está a solução 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:
Olá! tenho uma pequena pergunta enquanto estudava MQL4. O problema está localizado no tutorial deste site. Aqui está a condição: Problema 25. Crie um programa, no qual as seguintes condições sejam cumpridas: se a taxa exceder o nível especificado, ele emitirá uma mensagem, na qual palavras indicarão que a taxa excede o nível (até 100 pontos); em outros casos, a mensagem informará que a taxa não excede o nível especificado.
E aqui está a solução proposta:


Mostra as soluções possíveis. Útil para treinamento.

Há outras opções. Existem outros erros.

Confie mais em si mesmo. Experiência.

 
Step:
Olá! Ao estudar a MQL4, tenho uma pequena pergunta. A tarefa está localizada no tutorial deste site. Aqui está a condição: Problema 25. Crie um programa que realize as seguintes condições: se a taxa exceder o nível especificado, ele emitirá uma mensagem dizendo que a taxa excede o nível (até 100 pontos); em outros casos, a mensagem dizendo que a taxa não excede o nível especificado.
E aqui está a solução proposta:


P.S.

Especificamente, a utilidade deste exemplo para lidar com uma matriz,

a possível representação dos dados em palavras,

o uso da função NormalizeDouble e da variável Ponto pré-definida.

Possibilidade de escolher um hobby mais fácil.

 

Aparentemente, não há maneira de declarar variáveis externas diretamente na classe. Então, quais são as opções? Se eu não quiser declarar no próprio Expert Advisor ou em outro lugar estas variáveis específicas externas, que são necessárias somente quando se usa esta classe. Acho que a única opção é fazer um inluder, que declarará estas variáveis externas. E então a classe deve ser incluída nela, certo?

Então, para chamar a classe, você precisa incluir a própria classe. É assim? Ou pode haver algumas outras variantes?

Isso simplesmente não me parece bom. Muitos arquivos de inclusão aninhados para criar... É por isso que eu tenho tal pergunta.

Ou ainda é possível, como em uma biblioteca habitual, declarar variáveis externas e importar as bibliotecas necessárias antes de declarar a classe? Refiro-me a algo como isto:

// Объявляем внешние переменные
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:
 // открытые данные
};
Eu nunca tinha visto isso antes. Então me pergunto se estou indo na direção certa...
 
Transferência do código indicador para o Expert Advisor, ocorre um erro. Eu as produzi como variáveis globais na tela do terminal via Comentário.

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



Produza-as como variáveis globais para a tela do terminal através do Comentário. Não havia zeros, apenas números negativos. Então eu mudei

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

//---- indicator buffers
double zz[300];
tudo se encaixou, coloque tudo de volta no lugar. Nenhum erro! Qual foi a razão? Eu também desliguei a Internet.
 
semargl988:

Transferência do código indicador para o Expert Advisor, ocorre um erro. Divisão zero na parte do código

...

Calculou-as com variáveis globais para a tela do terminal via Comentário. Não havia zeros, apenas números negativos. Então eu mudei

...

para .

...

tudo se encaixou, colocá-lo de volta no lugar. Sem nenhum erro! Qual foi a causa? Eu desliguei a internet novamente.

Também recebi o erro "divisão zero" onde não foi possível passar zero no denominador da fração. Agora, antes de dividir, eu faço uma verificação formal como:

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

E o erro desapareceu. Isto é, o compilador deve ser instruído sobre o que fazer se o denominador=0 mesmo que o programador esteja 100% seguro de que não há 0 lá.

 

Olá, você pode, por favor, me ajudar com o código? Eu preciso que a EA faça o elementar - posições abertas ao se aproximar da linha vertical (ou seja, estritamente tempo, não preço), ou seja, para um intervalo shi especificado, que eu tenho aqui 120, ou seja, como eu entendo - 2 minutos. A cor da linha deve determinar se ela é comprada ou vendida. Pesquisei na Internet e reescrevi e consegui o seguinte:

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

}

}

Não é comercializado por algum motivo. Não escreve nenhum erro no log...
 
dmitriyriy666:

Olá, você pode, por favor, me ajudar com o código? Eu preciso que a EA faça o elementar - posições abertas ao se aproximar da linha vertical (ou seja, estritamente tempo, não preço), ou seja, para um intervalo shi especificado, que eu tenho aqui 120, ou seja, como eu entendo - 2 minutos. A cor da linha deve determinar se ela é comprada ou vendida. Pesquisei na Internet e a reescrevi:

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

}

}

O código não é comercializado por algum motivo. Ele não registra nenhum erro...

Se seu tempo coincide com o tempo do terminal, você pode usar TimeLocal(), mas TimeCurrent() é mais confiável .

Alterar o tipo de variável operacia para int e remover aspas OP_BUY e OP_SELL

 
AlexeyVik:

Se você tiver o mesmo tempo que o tempo do terminal, você pode usar TimeLocal(), mas oTimeCurrent() é mais confiável .

Alterar o tipo de variável operacia para int e remover aspas OP_BUY e OP_SELL



Obrigado. Sobre a TimeCurrent é verdade, meu tempo não corresponde ao tempo do servidor. Consertado, mas ainda não funciona... Não escreve nenhum erro no registro.


P.S. Em meu posto anterior, o código sem espaços foi de alguma forma inserido. Mas eu acho que coloquei corretamente todos os suportes de cabelo encaracolado.

 

MT4 - 625, mensagem do testador ao tentar testar corujas com biblioteca:

2014.03.29 18:38:48.753 'C:\Program Files\Admiral1\MQL4\Libraries\ingLib094.mq4' não é a versão 32-bit

Antes daquela coruja compilada sem problemas, e a biblioteca também não tinha uma única palavra. Na verdade, eu não entendo nada disso.

Meu sistema (quero dizer Windows) é de 32 bits, eu nunca tive outro. Sétimo.

A biblioteca é a minha nativa, até o fim. Vai bem em tempo real em novas construções. Incluindo com outras corujas. E em versões anteriores de teste sem problemas.

Mas não quer abrir no testador, e a razão é até sugada de seus dedos.

E não há uma palavra sobre os casos de 32 bits em todos os manuais.

Razão: