Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 569

 
Здравствуйте! При изучении MQL4 возник небольшой вопрос. Задача размещена в учебнике на этом сайте. Вот условие: Задача 25. Составить программу, в которой реализуются следующие условия: если курс поднялся выше заданного уровня, то выдать сообщение, в котором словами обозначено превышение над уровнем (до 100 пунктов); в остальных случаях сообщить, что курс не превышает заданный уровень.
А вот предложенное решение:
//--------------------------------------------------------------------
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:
Здравствуйте! При изучении MQL4 возник небольшой вопрос. Задача размещена в учебнике на этом сайте. Вот условие: Задача 25. Составить программу, в которой реализуются следующие условия: если курс поднялся выше заданного уровня, то выдать сообщение, в котором словами обозначено превышение над уровнем (до 100 пунктов); в остальных случаях сообщить, что курс не превышает заданный уровень.
А вот предложенное решение:


Показаны возможные пути решения. Полезно для обучения.

Есть другие варианты. Есть другие ошибки.

Больше доверяйте себе. Эксперементируйте.

 
Step:
Здравствуйте! При изучении MQL4 возник небольшой вопрос. Задача размещена в учебнике на этом сайте. Вот условие: Задача 25. Составить программу, в которой реализуются следующие условия: если курс поднялся выше заданного уровня, то выдать сообщение, в котором словами обозначено превышение над уровнем (до 100 пунктов); в остальных случаях сообщить, что курс не превышает заданный уровень.
А вот предложенное решение:


P.S.

Конкретно, польза данного примера в работе с массивом,

возможном представлении данных словами,

использование функции NormalizeDouble и предопределённой переменной Point.

Возможность выбрать хобби попроще.

 

 Судя по всему, в классе непосредственно нет возможности напрямую объявить внешние переменные. Тогда какие есть варианты? Если я не хочу объявлять в самом эксперте или где-нить ещё данные внешние специфические переменные, которые нужны только при использовании этого класса. Я так понимаю единственный вариант сделать инклюдник, в котором будут эти внешние переменные объявлены. А в него инклюдить ещё и класса, так?

 Тогда чтоб вызвать класс, нужно будет инклюдить инклюдник, который уже, в свою очередь, включает в себя, непосредственно, класс. Так? Или ещё какие-то варианты бывают?

 Просто как-то выглядит не очень как по мне. Куча вложенные файлов-включений создавать... Потому и вопрос такой. 

 Или всё-таки можно как в обычной библиотеке перед объявлением класса объявить внешние переменные и заимпортить требуемые библиотеки? Имею ввиду типа так:

// Объявляем внешние переменные
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:
 // открытые данные
};
Такого я не встречал. Вот и думаю, в правильном ли я направлении двигаюсь..
 
Переношу код индикатора в советник, возникает ошибка. zero divide в части кода

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



Выводил их глобальными переменными на экран терминала через Comment. Нулей не было, были только отрицательные числа. Потом сменил

//---- indicator buffers
double zz[1500];
на

//---- indicator buffers
double zz[300];
все встало на свои места, вернул обратно. Никакой ошибки нет! В чем была причина? Инет отключал еще.
 
semargl988:

Переношу код индикатора в советник, возникает ошибка. zero divide в части кода

...

Выводил их глобальными переменными на экран терминала через Comment. Нулей не было, были только отрицательные числа. Потом сменил

...

на

...

все встало на свои места, вернул обратно. Никакой ошибки нет! В чем была причина? Инет отключал еще.

У меня тоже выскакивала ошибка "zero divide" там, где в знаменателе дроби никак не мог быть передан ноль. Теперь перед делением делаю формальную проверку типа:

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

и ошибка исчезла. Т.е. компилятору надо дать инструкцию, что делать если знаменатель=0 даже если программер на 100% уверен что никакого 0 там и нет.

 

Здравствуйте, помогите, пожалуйста, с кодом. Мне нужно, чтобы советник делал элементарное - открывал позиции при подходе к вертикальной (т.е. строго временной, а не ценовой) линии, а именно за указанный промежуток shi, который у меня тут 120 т.е. как я понимаю - 2 минуты. Цвет линии должен определять бай это или селл. Поискал в инете и переписал, получилось следующее:

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

}

}

Так вот он не торгует почему-то. В лог ошибок не пишет...
 
dmitriyriy666:

Здравствуйте, помогите, пожалуйста, с кодом. Мне нужно, чтобы советник делал элементарное - открывал позиции при подходе к вертикальной (т.е. строго временной, а не ценовой) линии, а именно за указанный промежуток shi, который у меня тут 120 т.е. как я понимаю - 2 минуты. Цвет линии должен определять бай это или селл. Поискал в инете и переписал, получилось следующее:

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

}

}

Так вот он не торгует почему-то. В лог ошибок не пишет...

Если у тебя время компа совпадает с временем терминала, то можно использовать и TimeLocal() но всё-же надёжней TimeCurrent()

Измени тип переменной operacia на int и убери кавычки OP_BUY и OP_SELL

 
AlexeyVik:

Если у тебя время компа совпадает с временем терминала, то можно использовать и TimeLocal() но всё-же надёжней TimeCurrent()

Измени тип переменной operacia на int и убери кавычки OP_BUY и OP_SELL



Спасибо. Про ТаймКуррент это точно, у меня время не совпадает с серверным. Исправил, но всё равно не работает... В журнал никаких ошибок не пишет.


П.С. в предыдущем моём посте почему то код без пробелов вставился. Но я вроде все фигурные скобки правильно расставил.

 

МТ4 - 625, сообщение тестера при попытке тестировать сов с библиотекой:

2014.03.29 18:38:48.753 'C:\Program Files\Admiral1\MQL4\Libraries\ingLib094.mq4' is not 32-bit version

Перед этим сов компилился без запинки, и библиотечка тоже без единого слова. И ваще я совсем не понимаю.

Система у меня (в смысле винда) 32-битная, другой никогда не держал. Семерка.

Библиотека моя родная, всю дорогу с ней. Нормально идет в реальном времени на новом билде. В том числе с другими совами. И в тестере в более ранних версиях без проблем.

А вот в тестере открываться не желает, да еще и причину из пальца высосаллло.

И про 32-битные дела во всех хелпах нет ни слова.

Причина обращения: