Старт распродаж! Черная пятница - 50%



Основные понятия [17]
Торговые системы,тактики [67]
Форекс начинающим [16]
Разное [37]

Новый язык программирования, отличия от старого, решение некоторых проблем

Добавить в социальные закладки:

Новый терминал МТ4

Новый язык программирования, отличия от старого, решение некоторых проблем
 
     Новый язык программирования терминала МТ4 стал очень богатым. Он существенно расширил свои границы, здесь появились классы, ООП, графические элементы, новые операции с счетом, новые функции................................ Но и проблем с старым кодом здесь также присутствует.  
 
 
 
 
 
 
Для того, чтобы Вы понимали о чем идет речь, я создал советник, с наиболее частыми ошибками, которые вылазят при компиляции в новом билде. 
 
 
 
 
1. Названия переменных с вспомогательными символами например . (точка)
Все переменные которые имеют точку, или нижнее подчеркивание - теперь необходимо изменить на другое название. 
Былоextern int Test.dot=10;
Стало: extern int Testdot=10;
 
Былоextern int Test_dot=10;
Стало: extern int Testdot=10;
 
Ошибка, которая возникает при неправильном коде: '.' - semicolon expected
 
 
2. Задекларированных переменных теперь больше, и переменные, которые были названы именами новых функций - требует изменения имени. 
Былоextern double char=554.5;
Стало: extern double charnewexample=554.5;
 
Былоdouble new=10;
Стало: double neweample=10;
 
Ошибка, которая возникает при неправильном коде: 'char' - unexpected token или  'new' - name expected 
 
 
3. Каждая функция теперь должна иметь оператор возврата RETURN
Было
int Testreturnint()
  {
   int a;
   int b;
   if(a==b)return(1);
  }
Стало: 
int Testreturnint()
  {
   int a;
   int b;
   if(a==b)return(1);
   return(0);
  }
 
Было
bool Testreturnbool()
  {
   int a;
   int b;
   if(a==b)return(true);
  }
 
 
Стало: 
bool Testreturnbool()
  {
   int a;
   int b;
   if(a==b)return(true);
return(false);
  }
 
Было
void Testreturnvoid()
  {
   int a;
   int b;
   if(a==b)return;
  }
 
Стало: 
void Testreturnvoid()
  {
   int a;
   int b;
   if(a==b)return;
return;
  }
 
 
Было
string Testreturnstring()
  {
   int a;
   int b;
   if(a==b)return("43");
  }
Стало: 
string Testreturnstring()
  {
   int a;
   int b;
   if(a==b)return("43");
return("");
  }
 
Предупреждение, которое возникает при неправильном коде: not all control paths return a value
 
 
4. Функция switсh в качестве выражения может принимать только Целые числа
Если раньше через switсh можно было перебирать любые значения, то теперь данный оператор может принимать только целые числа в качестве сравнения, для того чтобы Ваша функция работала  дальше, Вам необходимо заменить ее на операторы сравнения if else
Было
int Testswitchdouble()
  {
   double k1=1.432;
   int y;
   switch(k1)
     {
      case 1.432:y=1;break;
      case 1.433:y=2;break;
      case 1.434:y=3;break;
     }
  }
Стало: 
int Testswitchdouble()
  {
   double k1=1.432;
   int y;
       if(k1== 1.432)y=1;
       if(k1==  1.433)y=2;
       if(k1==  1.434)y=3;
   return(y);
  }
 
Ошибка, которая возникает при неправильном коде: 'k1' - illegal switch expression type и  '1.432' - constant expression is not integral или 
'MarketInfo' - illegal switch expression type   
 
 
 
5. Все переменные объявленные внутри функции, должны отличаться от названий глобальных переменных (Необязательно)
Предупреждение, которое возникает при неправильном коде: declaration of 'testvariable' hides global declaration 
 
6. Все переменные, должны соответствовать по типу в используемых функциях 
Если Вы выводите например Print или ищите строку StringFind или объект ObjectCreate Вы  должны соответственно писать правильный тип данной переменной, или переводить переменную в нужный тип
Было
int test=1;
Print(AccountNumber());
StringFind("Пример строки",test);
ObjectCreate(0,test,OBJ_LABEL,0,0,0);
Стало: 
int test=1;
Print((string)AccountNumber());
StringFind("Пример строки",(string)test);
ObjectCreate(0,(string)test,OBJ_LABEL,0,0,0);
 
В круглых скобках можно задать тип переменной, который будет конвертироваться автоматически 
 
Было
int    dg=MarketInfo(Symbol(), MODE_DIGITS);
Стало: 
double    dg=MarketInfo(Symbol(), MODE_DIGITS);
 
Ошибка или предупреждение, которые возникает при неправильном коде: the second parameter for StringFind function must be a string - возникает уже после компиляции эксперта
implicit conversion from 'number' to 'string'
possible loss of data due to type conversion
 
 
 
 
7. Сторонние библиотеки и функции , которые включают в себя передачу строк в DLL
Если в Вашем эксперте есть функции, которые имеют переменные стринг, в новом билде нужно переводить в юникод, Это не сложно. 
 
например:
Было
#import "wininet.dll"
int InternetOpenA(string sAgent,int lAccessType,
                  string sProxyName="",string sProxyBypass="",
                  int lFlags=0);
int InternetOpenUrlA(int hInternetSession,string sUrl,
                     string sHeaders="",int lHeadersLength=0,
                     int lFlags=0,int lContext=0);
#import
Стало: 
#import "wininet.dll"
int InternetOpenW(string sAgent,int lAccessType,
                  string sProxyName="",string sProxyBypass="",
                  int lFlags=0);
int InternetOpenUrlW(int hInternetSession,string sUrl,
                     string sHeaders="",int lHeadersLength=0,
                     int lFlags=0,int lContext=0);
#import
 
Ошибка , которые возникает при неправильном коде:  Error in call InternetOpenUrlA()
 
8. Жесткий поиск ошибок #property strict
установите данный код в начале Вашего советника, и Ваш советник выдаст кучу ошибок. Данные ошибки прошли жесткий отбор, и исправляя их Вы получите максимум скорости от Вашего эксперта. А также чистейший код советника
 
9. Все остальные  ошибки и предупреждения решаются в индивидуальном порядке. 
 
Как видите мы решили все вопросы с ошибками в течении 1 минуты Вашего времени. 
Спасибо за внимание. теперь окно ошибок выглядит так:
 
 
10. Еще один нюанс в 625 билде терминала мт4 should be checked 
 
  • return value of 'OrderSelect' should be checked 
  • return value of 'OrderDelete' should be checked 
  • return value of 'OrderSend' should be checked 
  • return value of 'OrderClose' should be checked 
  • return value of 'OrderModify' should be checked 


для того, чтобы не было таких предупреждений  нужно явно указать возврат в переменную 
например так: 
  • bool select1=OrderSelect.......... 
  • bool delete1=OrderDelete.......... 
  • bool close1=OrderClose.......... 
  • bool modify1=OrderModify.......... 
  • int send1=OrderSend.......... 
 
 
11. check operator precedence for possible error; use parentheses to clarify precedence  
предупреждения касаются очередности операторов и\или 

например у Вас написано: 
 
Код
if(gsa_1108[gi_1100]==Symbol() && LineOnGraph&& gi_360==2 || gi_360==3 || gi_360==4 || gi_360==5)


Если заменить это на :  
 
Код
if(gsa_1108[gi_1100]==Symbol() && LineOnGraph && (gi_360==2 || gi_360==3 || gi_360==4 || gi_360==5))


то предупреждение пропадет. 

Т.е. если у Вас в условии написано и и и или или или , без скобок, 

не хватает скобок, их нужно расставить правильно. 

в декомпилированном коде это не совсем удобно, потому что от скобки зависит торговля всего эксперта.
 
Решение индивидуальных проблем с советниками
 
Если у Вас не работает эксперт или индикатор на новом билде, не появляется в навигаторе, не показывает значения или работает неправильно, ВЫ можете обратиться в наш форум. Все просьбы по изменению ошибок и советников будут удовлетворятся в порядке свободного времени. Если у Вас срочный заказ,  Вы можете обратиться в наш раздел Программирования и подать нам заявку, решение проблем в таком случае платное. И стоимость исправления ошибок на новом билде зависит от количества ошибок.  


Получить бесплатно Новый язык программирования, отличия от старого, решение некоторых проблем

Категория: Разное | Добавил: expforex (01.02.2014)
Просмотров: 7565 | Комментарии: 10 | Теги: старого, язык, отличия, некоторых, От, программирования, проблем, Новый, решение | Рейтинг: 4.0/1 |
Всего комментариев: 10
   10               expforex        (08.01.2016 12:43)
было 
  
Код
int Digitslot;
    switch (MarketInfo(Symbol(), MODE_MINLOT)) {
    case 0.001:
       Digitslot = 3;
       break;
    case 0.01:
       Digitslot = 2;
       break;
    case 0.1:
       Digitslot = 1;
       break;
    case 1.0:
       Digitslot = 0;
    }


стало:

   
Код
int Digitslot;
       if (MarketInfo(Symbol(), MODE_MINLOT) == 0.001)Digitslot=3;
       if (MarketInfo(Symbol(), MODE_MINLOT) == 0.01)Digitslot=2;
       if (MarketInfo(Symbol(), MODE_MINLOT) == 0.1)Digitslot=1;
       if (MarketInfo(Symbol(), MODE_MINLOT) == 1)Digitslot=0;

   5               expforex        (25.03.2014 16:24)
Еще один нюанс в 625 билде терминала мт4 should be checked

  • return value of 'OrderSelect' should be checked
  • return value of 'OrderDelete' should be checked
  • return value of 'OrderSend' should be checked
  • return value of 'OrderClose' should be checked
  • return value of 'OrderModify' should be checked


для того, чтобы не было таких предупреждений  нужно явно указать возврат в переменную
например так:
  • bool select1=OrderSelect..........
  • bool delete1=OrderDelete..........
  • bool close1=OrderClose..........
  • bool modify1=OrderModify..........
  • int send1=OrderSend..........

   4               expforex        (25.03.2014 15:48)
Компания Метаквотс выпустила статью
после моей :-)

http://articles.mql4.com/ru/1152
рекомендую прочитать.

   3               expforex        (16.03.2014 11:26)
check operator precedence for possible error; use parentheses to clarify precedence 
предупреждения касаются очередности операторов и\или

например у Вас написано:

Код
if(gsa_1108[gi_1100]==Symbol() && LineOnGraph&& gi_360==2 || gi_360==3 || gi_360==4 || gi_360==5)


Если заменить это на : 

Код
if(gsa_1108[gi_1100]==Symbol() && LineOnGraph && (gi_360==2 || gi_360==3 || gi_360==4 || gi_360==5))


то предупреждение пропадет.

Т.е. если у Вас в условии написано и и и или или или , без скобок,

не хватает скобок, их нужно расставить правильно.

в декомпилированном коде это не совсем удобно, потому что от скобки зависит торговля всего эксперта.

   2               expforex        (16.02.2014 17:32)
Данное предупреждение означает что в вашей функции используется имя переменной, которое также доступно в глобальных переменных. такую переменную в функции лучше заменить на другое название.

Имя *:
Email:
Код *:



WebMoney Яндекс цитирования.