Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 147

 

советник должен считать из файла массив данных в виде: дата целое1 целое2 целое3 целое4, можно из любого типа файла, кроме bin.

файл скопировал в папку C:\Users\Михаил\AppData\Roaming\MetaQuotes\Tester\1B9501BF48F2354A4685940A72752910\Agent-127.0.0.1-3000\MQL5\Files\qqq.scv

он удаляется из этой папки

вот код


int File()
{
int P=0;

int filehandle=FileOpen("qqq.csv",FILE_READ|FILE_CSV,","); 
if(filehandle!=INVALID_HANDLE) 
     { 
     datetime d = FileReadDatetime(filehandle);
   int I=FileReadNumber(filehandle);
     FileClose(filehandle);
     Comment(d+" "+I);
     }
     else {Comment("qqq.csv");}
return P;

}

может указать путь к папке, из которой файл не будет удаляться тестером? Я так понял, что все файлы удаляются из этой папки при тестировании, но при создании файла программно, он помещается именно в эту папку
 

 
Mikhail Simakov:

советник должен считать из файла массив данных в виде: дата целое1 целое2 целое3 целое4, можно из любого типа файла, кроме bin.

файл скопировал в папку C:\Users\Михаил\AppData\Roaming\MetaQuotes\Tester\1B9501BF48F2354A4685940A72752910\Agent-127.0.0.1-3000\MQL5\Files\qqq.scv

он удаляется из этой папки

вот код

может указать путь к папке, из которой файл не будет удаляться тестером? Я так понял, что все файлы удаляются из этой папки при тестировании, но при создании файла программно, он помещается именно в эту папку

Может стоит использовать FileCopy с флагом FILE_COMMON. Новое тестирование работает с чистого листа, в этом может глюк быть.

 
Konstantin Nikitin:

Может стоит использовать FileCopy с флагом FILE_COMMON. Новое тестирование работает с чистого листа, в этом может глюк быть.

получается считать файл, если его скопировать в папку во время тестирования )) теперь разобраться с разделителем

 

Начал писать торговую панель в MQL4 и вот какой парадокс. Все выглядит нормально, но каждый раз после смены ТФ, линии и текст от других индикаторов рисуются уже поверх моей панели.

Вот, что проверил: при смене ТФ параметр OBJPROP_BACK = false. То есть, с этой стороны все в порядке.

Есть идеи по этому поводу?

П.С. Собственно говоря, сейчас проверил, исходный код (который я взял за прообраз) ведет себя так же. После смены ТФ рисуются поверх панели обычные линии и созданные индикаторами в которых не используется ООП.
https://www.mql5.com/ru/code/19220
Infopanel
Infopanel
  • www.mql5.com
Пример создания простого и быстрого меню с поддержкой нескольких языков. В примере выводится информация о цене, времени до следующего бара, балансе счета, количестве ордеров. Данный пример можно использовать в качестве шаблона для создания своих разработок. Минус данного метода при добавлении, удалении или редактировании объектов необходимо...
 
Goya7:

Начал писать торговую панель в MQL4 и вот какой парадокс. Все выглядит нормально, но каждый раз после смены ТФ, линии и текст от других индикаторов рисуются уже поверх моей панели.

Вот, что проверил: при смене ТФ параметр OBJPROP_BACK = false. То есть, с этой стороны все в порядке.

Есть идеи по этому поводу?

П.С. Собственно говоря, сейчас проверил, исходный код (который я взял за прообраз) ведет себя так же. После смены ТФ рисуются поверх панели обычные линии и созданные индикаторами в которых не используется ООП.
https://www.mql5.com/ru/code/19220

При переключении тайма, объекты созданные другими программами удаляются, и тут-же создаются новые. В панели объекты не удаляются, поэтому они "старые". На графике действует принцип: "Кто последний - тот и сверху"

Нужно и в панели удалять объекты в DeInit(), и снова создавать новые

 
Goya7:

Начал писать торговую панель в MQL4 и вот какой парадокс. Все выглядит нормально, но каждый раз после смены ТФ, линии и текст от других индикаторов рисуются уже поверх моей панели.

Вот, что проверил: при смене ТФ параметр OBJPROP_BACK = false. То есть, с этой стороны все в порядке.

Есть идеи по этому поводу?

П.С. Собственно говоря, сейчас проверил, исходный код (который я взял за прообраз) ведет себя так же. После смены ТФ рисуются поверх панели обычные линии и созданные индикаторами в которых не используется ООП.
https://www.mql5.com/ru/code/19220
Vitaly Muzichenko:

При переключении тайма, объекты созданные другими программами удаляются, и тут-же создаются новые. В панели объекты не удаляются, поэтому они "старые". На графике действует принцип: "Кто последний - тот и сверху"

Нужно и в панели удалять объекты в DeInit(), и снова создавать новые

лучше в Событиях отлавливать создание нового объекта, и перерисовывать панель

 
Vitaly Muzichenko:

При переключении тайма, объекты созданные другими программами удаляются, и тут-же создаются новые. В панели объекты не удаляются, поэтому они "старые". На графике действует принцип: "Кто последний - тот и сверху"

Нужно и в панели удалять объекты в DeInit(), и снова создавать новые

Спасибо за мысли. В DeInit() они конечно же удаляются. При смене ТФ процедура Init() проходит, но что-то мне говорит что панель заново не рисуется. А именно: я экспериментировал и установил другую панель, которая территориально находится где и моя, а затем удалил ее. Моя тоже пропала (до смены ТФ) - значит не перерисовывается. ((
Подскажите чуть подробнее, как ее перерисовывать?


Taras Slobodyanik:

лучше в Событиях отлавливать создание нового объекта, и перерисовывать панель

Подскажите, как это делать, я всего пол часа как программист. :)
 
int OnInit()
{
ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE,true);
}


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//событие создания нового объекта на чарте
if(id==CHARTEVENT_OBJECT_CREATE && StringFind(sparam, prefix, 0)<0)
   {
   //удаляем панель и рисуем заново

   ChartRedraw();
   }
}

пс. вспомнил - еще нужно проверять имя созданного объекта, чтобы это был "не свой" объект (prefix - префикс имен своих объектов).
или же вместо имени сравнивать тип объектов.

 
Граждане подскажите правильно ли я делаю!!! Нужно что бы советник торговал когда не вошел за зону 30 или 70, а когда зашел, то не торговал!!! Так правильно сделано?

RSI3 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 1);
RSI4 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 2);

bool RSItf = RSI3 > 30 && 30 > RSI4;
if(RSItf == true)
{
}
else
{
ordersend(_Symbol, OP_SELL, lot, Bid, Slippage, 0, 0, NULL, Magic, 0, clrRed);
}
bool RSItf = RSI3 > 70 && 70> RSI4;
if(RSItf == true)
{
}
else
{
ordersend(_Symbol, OP_BUY, lot, Ask, Slippage, 0, 0, NULL, Magic, 0, clrBlue);
}
 
ponochka:
Граждане подскажите правильно ли я делаю!!! Нужно что бы советник торговал когда не вошел за зону 30 или 70, а когда зашел, то не торговал!!! Так правильно сделано?

Как-то так, насколько я понял вам надо

int RSIPeriod = 0, Slippage = 5, Magic = 1234;
double lot = 0.1;

void OnStart()
{
     double RSI3 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 1),
            RSI4 = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE, 2);
     int ticket = 0;
     
     if(RSI3 <= 30 && RSI4 <= 30)
          ticket = OrderSend(_Symbol, OP_SELL, lot, Bid, Slippage, 0, 0, NULL, Magic, 0, clrRed);
     
     if(RSI3 >= 70 && RSI4 >= 70)
          ticket = OrderSend(_Symbol, OP_BUY, lot, Ask, Slippage, 0, 0, NULL, Magic, 0, clrBlue);
}