Новая версия платформы MetaTrader 4 build 950: Встроенные видеоролики и улучшение работы - страница 2

 
Хорошо бы в тестере к кнопкам "старт" и "стоп" добавить "пауза", чтоб отключать ПК не выключая долгую оптимизацию.
 

Если открывать и закрывать окно глобальных переменных терминала через F3, информация в окне появляется не всегда, то пусто, то есть. Причем может отображаться разное количество глобальных переменных, хотя ни каких зацикленных скриптов ни советников на графиках нет. Периодически значение глобальной переменной, которая устанавливается с помощью скрипта не сохраняется, хотя Алерт из скрипта показывает, что значение переменной установлено правильно.

Глобальная переменная в окне удаляется, но  после нескольких раз открытия и закрытия окна снова появляется в окне.

Скрипт, с помощью которого устанавливаю значение глобальной переменной.

//+------------------------------------------------------------------+
//|                                                    SetOrders.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//#property strict


//+----------------------------------------------------------------------------+
//| Script program start function                                              |
//+----------------------------------------------------------------------------+
void OnStart()
  {
//---
   double drop_price = 0;
   drop_price = NormalizeDouble(WindowPriceOnDropped(),Digits);                    
   while(GlobalVariableGet(GetNameTF(Period())+" "+Symbol()+" TypOpders")!=3)
        {
         GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" Drop_price", drop_price);
         GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" TypOpders", 3);   
        }
    Alert("TypOrder=",GlobalVariableGet(GetNameTF(Period())+" "+Symbol()+" TypOpders"));     
  }
  
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Возвращает наименование таймфрейма                                        |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame) {
        switch (TimeFrame) {
                case PERIOD_M1:  return("M1");
                case PERIOD_M5:  return("M5");
                case PERIOD_M15: return("M15");
                case PERIOD_M30: return("M30");
                case PERIOD_H1:  return("H1");
                case PERIOD_H4:  return("H4");
                case PERIOD_D1:  return("Daily");
                case PERIOD_W1:  return("Weekly");
                case PERIOD_MN1: return("Monthly");
                default:                     return("UnknownPeriod");
        }
}
 

У меня тоже была проблема с глобальной переменной терминала после обновления на 950 билд.

Переменная создается и удаляется скриптом. Её удаляешь, терминал выключаешь-включаешь, она опять на месте. С 3-го раза переменная всё-таки пропала каким-то образом. Теперь боюсь этой глобальной переменной )))

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

 
хм. Вы меня сейчас озадачили, есть эксперты которые работают по глоб переменным. побег проверять 
 
Sergey Basov:

У меня тоже была проблема с глобальной переменной терминала после обновления на 950 билд.

Переменная создается и удаляется скриптом. Её удаляешь, терминал выключаешь-включаешь, она опять на месте. С 3-го раза переменная всё-таки пропала каким-то образом. Теперь боюсь этой глобальной переменной )))

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

Я на прежних версиях иногда замечал, что не всегда скриптом глобальная переменная устанавливается. Поэтому на всякий случай зациклил  установку глобальной переменной с помощью while(). И вроде как больше не замечал, но вот сегодня на 950 бильде какое-то время (наверно мин 20) то устанавливалась, то вообще не мог установить. Хорошо, что я использую глобальные переменные для установки ордеров в ручном режиме и сразу вижу результат. А если автомат работает, то это может привести к плохим последствиям. У меня в эксперте для ручной работы в функции  OnDeinit(const int reason) стоит функция GlobalVariableDel(GetNameTF(Period())+" "+Symbol()+" TypOpders"). Заметил что при снятии эксперта с графика глобальная переменная не удаляется.
 
khorosh:
Я на прежних версиях иногда замечал, что не всегда скриптом глобальная переменная устанавливается. Поэтому на всякий случай зациклил  установку глобальной переменной с помощью while(). И вроде как больше не замечал, но вот сегодня на 950 бильде какое-то время (наверно мин 20) то устанавливалась, то вообще не мог установить. Хорошо, что я использую глобальные переменные для установки ордеров в ручном режиме и сразу вижу результат. А если автомат работает, то это может привести к плохим последствиям. У меня в эксперте для ручной работы в функции  OnDeinit(const int reason) стоит функция GlobalVariableDel(GetNameTF(Period())+" "+Symbol()+" TypOpders"). Заметил что при снятии эксперта с графика глобальная переменная не удаляется.
А Вы глобальные переменные прямо устанавливаете или проверяете на возвращаемое значение?
 
Karputov Vladimir:
А Вы глобальные переменные прямо устанавливаете или проверяете на возвращаемое значение?
Я использую их при ручной торговле для открытия ордеров. Бросаю на график скрипт, который присваивает глобальной переменной определённое значение, которое задаёт тип операции. В эксперте по значению глобальной переменной открывается тот или иной вид ордера. Я сразу вижу когда глобальная переменная не установилась, по тому как установился или нет ордер. Я привёл вверху код одного из скриптов с помошью которого я устанавливаю лимитный ордер. Там для контроля я установил алерт, который сообщает установленное значение глобальной переменной. 
 
khorosh:
Я использую их при ручной торговле для открытия ордеров. Бросаю на график скрипт, который присваивает глобальной переменной определённое значение, которое задаёт тип операции. В эксперте по значению глобальной переменной открывается тот или иной вид ордера. Я сразу вижу когда глобальная переменная не установилась, по тому как установился или нет ордер. Я привёл вверху код одного из скриптов с помошью которого я устанавливаю лимитный ордер. Там для контроля я установил алерт, который сообщает установленное значение глобальной переменной. 

Я не о этом. В коде идёт проверка успешности создания/присвоения нового значения глобальной переменной

   ResetLastError();
   if(GlobalVariableSet(FullName,variable_rezult)==0) // creates a new global variable
     {
      Print("Failed to creates a new global variable ",GetLastError());
      return(INIT_FAILED);
     }

 

или идёт проверка существования/возврата значения

      ResetLastError();
      if(!GlobalVariableGet(FullName,variable_rezult))
        {
         Print("Failed to get a value of global variable ",GetLastError());
         return(INIT_FAILED);
        }

 ?

 
Не хватает возможности визуального тестеривания нескольких тф одновременно. 
 

Проверьте пожалуйста у кого может так получиться?


Вот код

/********************************************************************\
                                                      W_R_struct.mq4 |
                                            Copyright 2015, Viktorov |
                                                      v4forex@qip.ru |
\********************************************************************/
#property copyright "Copyright 2015, Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property strict

struct strOrd
{
 double  priceOpen;
 int     type;
 int     ticket;
 int     group;
};

strOrd   aktiveOrder, order_0, order_1, order_2;
string comment;
/*******************Expert initialization function*******************/
int OnInit()
{
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function***********************/
void OnTick()
{
  int openB, openS;
   if(OrdersTotal() < 1)
    {
     openB = OrderSend(_Symbol, OP_BUYSTOP, 0.1, Ask+100*_Point, 50, 0, 0, NULL, 111);
      if(openB > 0)
       {
           Print("*********** openB ** Заполняем структуру ", OrderTicket());
          order_0.ticket = OrderTicket();
           order_0.type = OrderType();
            order_0.group = OrderMagicNumber();
             order_0.priceOpen = OrderOpenPrice();
                /* Записали структуру в файл */
            fun_WriteStruct(OrderTicket(), order_0);
        openB = 0;
        comment = StringConcatenate(order_0.ticket, "\n", order_0.type, "\n",order_0.group, "\n",order_0.priceOpen, "\n");
       }
      
       openS = OrderSend(_Symbol, OP_SELLSTOP, 0.1, Ask-150*_Point, 50, 0, 0, NULL, 111);
      if(openS > 0)
       {
           Print("*********** openS ** Заполняем структуру ", OrderTicket());
          order_1.ticket = OrderTicket();
           order_1.type = OrderType();
            order_1.group = OrderMagicNumber();
             order_1.priceOpen = OrderOpenPrice();
                /* Записали структуру в файл */
            fun_WriteStruct(OrderTicket(), order_1);
        openS = 0;
        comment = StringConcatenate(comment, order_1.ticket, "\n", order_1.type, "\n",order_1.group, "\n",order_1.priceOpen, "\n");
       }
    }
      //Print("*************** OrderType ", OrderType());
         for(int i = 0; i < OrdersTotal(); i++)
          {
                   /* Если ордкр активировался */
           if(OrderSelect(i, SELECT_BY_POS))
            {
             fun_ReadStruct(OrderTicket(), order_0);
              if(OrderType() != order_0.type)
               {
                Print("1 ************** order_0.ticket ", order_0.ticket, "** order_0.type ", order_0.type);
                  /* перезаполнили поле структуры */
                order_0.type = OrderType();
                  /* и перезаписали файл */
                fun_WriteStruct(order_0.ticket, order_0);
                 /* прочли файл в другую струткуту */
                fun_ReadStruct(order_0.ticket, aktiveOrder);
                 /* и получили тип ордера OP_BUYSTOP */
                Print("2 ************** aktiveOrder.ticket ", aktiveOrder.ticket, "** aktiveOrder.type ", aktiveOrder.type);
               }
            }
          }
   Comment(comment);
}/*******************************************************************/

void fun_WriteStruct(int ticket, strOrd & strName)
{
 string fileName = StringConcatenate(ticket, ".txt");
  int handle = FileOpen(fileName, FILE_WRITE|FILE_BIN|FILE_COMMON);
   if(handle > INVALID_HANDLE)
    {
     FileWriteStruct(handle, strName);
      //FileFlush(handle);
      //Sleep(5000);
     FileClose(handle);
    }
}/*******************************************************************/

bool fun_ReadStruct(int ticket, strOrd & strName)
{
 bool rez = false;
  string fileName = StringConcatenate(ticket, ".txt");
   int handle = FileOpen(fileName, FILE_READ|FILE_BIN|FILE_COMMON);
    if(handle > INVALID_HANDLE)
     {
      FileReadStruct(handle, strName);
       FileClose(handle);
      rez = true;
     }
 return(rez);
}/*******************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
{
   Comment("");
}/*******************************************************************/

У меня почему-то устанавливает ордер #1 а строка

Print("*********** openB ** Заполняем структуру ", OrderTicket());

Печатает

*********** openB ** Заполняем структуру 2

Это на билде 950. И на 825 так-же. Что за проблема???

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