Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
Так в чем проще то???
Проще в том, что без цикла получаешь значение меньше заданного. А дальше как твоей душе угодно так и подгоняй под минимальное значение.
Вот распиши своё решение делением на 10 в цикле, чтобы получить от 3 до 12
 

ivansss

Новичок форума
Добрый день. Прошу помощи в MQL5. Возникла проблема с обработкой закрытых позиций. Конечный результат - найти бар открытия последней закрытой сделки и записать данные в файл. В результате запись идет только когда (Closes > Opens)- позиция была на Buy
(Closes >= Opens)- позиция была на sell
Два других файлах по другим условиям не пишет.


datetime start_time = StringToTime(TimeToString(TimeCurrent(), TIME_DATE));
if(!Fn_get_trade_history(start_time = 0)){return;}// подгружаем историю

int deals = HistoryDealsTotal();
for(int i = 0; i < deals; i++)
{
ulong deal_ticket = HistoryDealGetTicket(i);

int position_ID = HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
if(position_ID > last_position_ID)
{
last_position_ID = position_ID;

ENUM_DEAL_ENTRY entry_type = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
if(entry_type == DEAL_ENTRY_IN){time_in = HistoryDealGetInteger(deal_ticket,DEAL_TIME);}
if(entry_type == DEAL_ENTRY_OUT){time_out = HistoryDealGetInteger(deal_ticket,DEAL_TIME);}

int BarShiftOpen = iBarShift(Symbol(),PERIOD_CURRENT,time_in,false);
int BarShiftClose = iBarShift(Symbol(),PERIOD_CURRENT,time_out,false);

double Opens = iOpen(Symbol(),PERIOD_CURRENT,BarShiftOpen);
double Closes = iClose(Symbol(),PERIOD_CURRENT,BarShiftClose);

if((ENUM_DEAL_TYPE)HistoryDealGetInteger(deal_ticket,DEAL_TYPE) == DEAL_TYPE_BUY)
{
if(Closes > Opens)
{
---------------------
}
if(Closes <= Opens)
{
---------------------
}
}
if((ENUM_DEAL_TYPE)HistoryDealGetInteger(deal_ticket,DEAL_TYPE) == DEAL_TYPE_SELL)
{
if(Closes < Opens)
{
---------------------
}
if(Closes >= Opens)
{
---------------------
}
}
 
Последнее редактирование:

_SERG_

Активный участник
Конечный результат - найти бар открытия последней закрытой сделки и записать данные в файл.
А тебя не смущает, что при переключении таймфрема графика, это будут разные бары?
Ну, а время открытия, ты заблаговременно можешь записывать в файл, или куда там тебе удобно, сразу после открытия позиции (ордера), а потом искать что тебе надо.
 

AlexeyVik

Программист mql4 mql5
Добрый день. Прошу помощи в MQL5. Возникла проблема с обработкой закрытых позиций. Конечный результат - найти бар открытия последней закрытой сделки и записать данные в файл. В результате запись идет только когда (Closes > Opens)- позиция была на Buy
(Closes >= Opens)- позиция была на sell
Два других файлах по другим условиям не пишет.


datetime start_time = StringToTime(TimeToString(TimeCurrent(), TIME_DATE));
if(!Fn_get_trade_history(start_time = 0)){return;}// подгружаем историю

int deals = HistoryDealsTotal();
for(int i = 0; i < deals; i++)
{
ulong deal_ticket = HistoryDealGetTicket(i);

int position_ID = HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
if(position_ID > last_position_ID)
{
last_position_ID = position_ID;

ENUM_DEAL_ENTRY entry_type = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
if(entry_type == DEAL_ENTRY_IN){time_in = HistoryDealGetInteger(deal_ticket,DEAL_TIME);}
if(entry_type == DEAL_ENTRY_OUT){time_out = HistoryDealGetInteger(deal_ticket,DEAL_TIME);}

int BarShiftOpen = iBarShift(Symbol(),PERIOD_CURRENT,time_in,false);
int BarShiftClose = iBarShift(Symbol(),PERIOD_CURRENT,time_out,false);

double Opens = iOpen(Symbol(),PERIOD_CURRENT,BarShiftOpen);
double Closes = iClose(Symbol(),PERIOD_CURRENT,BarShiftClose);

if((ENUM_DEAL_TYPE)HistoryDealGetInteger(deal_ticket,DEAL_TYPE) == DEAL_TYPE_BUY)
{
if(Closes > Opens)
{
---------------------
}
if(Closes <= Opens)
{
---------------------
}
}
if((ENUM_DEAL_TYPE)HistoryDealGetInteger(deal_ticket,DEAL_TYPE) == DEAL_TYPE_SELL)
{
if(Closes < Opens)
{
---------------------
}
if(Closes >= Opens)
{
---------------------
}
}
После того как определил нужную сделку и получил идентификатор позиции обязательно надо получить список ордеров и сделок которые принадлежат этой позиции
Код:
bool  HistorySelectByPosition(
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER
   );
После чего получить количество сделок HistoryDealsTotal
Возвращает количество сделок в истории. Перед вызовом функции HistoryDealsTotal() необходимо получить историю сделок и ордеров с помощью функции HistorySelect() или HistorySelectByPosition().

и перебрать их определяя тип сделки…
 

ssg

Интересующийся

mobidik

Добрый вечер. По горячим следам .
Напишите пожалуйста функцию для советника где рандомно в начале каждых торговых суток (как в предыдущем примере) назначается одна из открываемых позиций( бай или селл) или один из ордеров (байлимит, селллимит, байстоп, селлстоп). Если Вас это сильно не затруднит.
Благодарю.
 

mobidik

-----

mobidik

Добрый вечер. По горячим следам .
Напишите пожалуйста функцию для советника где рандомно в начале каждых торговых суток (как в предыдущем примере) назначается одна из открываемых позиций( бай или селл) или один из ордеров (байлимит, селллимит, байстоп, селлстоп). Если Вас это сильно не затруднит.
Благодарю.
Раз Вы в этой ветке, значит пытаетесь что делать сами - это хорошо. Так вот, по горячим следам, как Вы сказали: берете результат, полученный от ф-ции MathRand() и делаете проверку на чет/нечет, а там уже, как угодно: чет - бай, нечет - селл или отложки... Пробуйте сами сделать, тут нет ничего сложного.
 

ssg

Интересующийся
mobidik, добрый день.
А если сделать так:

extern int min = 0;
extern int max = 5;


if(Random=0)ordertype=OP_BUY;
.
.
if(Random=5)ordertype=OP_SELLSTOP;

и дальше

OrderSend(symb,ordertype,Lots,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
Ваше мнение?
 

AlexeyVik

Программист mql4 mql5
mobidik, добрый день.
А если сделать так:

extern int min = 0;
extern int max = 5;


if(Random=0)ordertype=OP_BUY;
.
.
if(Random=5)ordertype=OP_SELLSTOP;

и дальше

OrderSend(symb,ordertype,Lots,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
Ваше мнение?
Код:
  srand(GetTickCount());         //    Устанавливаем начальное состояние для генерации ряда псевдослучайных целых чисел
  int orderType = rand()%6;    //    Получим остаток от деления случайного числа на 6
Таким образом можем получить
Свойства ордеров
OP_BUY0Покупка
OP_SELL1Продажа
OP_BUYLIMIT2Отложенный ордер BUY LIMIT
OP_SELLLIMIT3Отложенный ордер SELL LIMIT
OP_BUYSTOP4Отложенный ордер BUY STOP
OP_SELLSTOP5Отложенный ордер SELL STOP
и дальше OrderSend(с соответствующими параметрами)
 

mobidik

-----
mobidik, добрый день.
А если сделать так:

extern int min = 0;
extern int max = 5;


if(Random=0)ordertype=OP_BUY;
.
.
if(Random=5)ordertype=OP_SELLSTOP;

и дальше

OrderSend(symb,ordertype,Lots,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
Ваше мнение?
Так пробуйте, в тестере.
Для удобства: вместо установки позиций пропишите принт - Print("Random = ",Random);, тогда в закладке "Эксперты" будут записи о значении рандома.
 

ssg

Интересующийся
Код:
  srand(GetTickCount());         //    Устанавливаем начальное состояние для генерации ряда псевдослучайных целых чисел
  int orderType = rand()%6;    //    Получим остаток от деления случайного числа на 6
Таким образом можем получить
Свойства ордеров
OP_BUY0Покупка
OP_SELL1Продажа
OP_BUYLIMIT2Отложенный ордер BUY LIMIT
OP_SELLLIMIT3Отложенный ордер SELL LIMIT
OP_BUYSTOP4Отложенный ордер BUY STOP
OP_SELLSTOP5Отложенный ордер SELL STOP
и дальше OrderSend(с соответствующими параметрами)

AlexeyVik, добрый вечер.​

Функция GetTickCount() возвращает количество миллисекунд - это функция для пятерки, а чем ее заменить в четверке?
 

ssg

Интересующийся
Так пробуйте, в тестере.
Для удобства: вместо установки позиций пропишите принт - Print("Random = ",Random);, тогда в закладке "Эксперты" будут записи о значении рандома.
mobidik, добрый вечер.
я в пробном варианте советника все варианты рандома(от 0 до 6) примитивно прописал через функцию if в советнике. Это работает, по крайней мере в тестере.Но хотелось бы это иметь в виде функции. Что бы при желании ее можно было вставить в любой советник. И конечно эта задача имеет больше теоретический интерес, чем практический.
Ведь рандом - он и на то рандом, что при каждом проходе его значения будут отличаться от предыдущего.
 

mobidik

-----
mobidik, добрый вечер.
я в пробном варианте советника все варианты рандома(от 0 до 6) примитивно прописал через функцию if в советнике. Это работает, по крайней мере в тестере.Но хотелось бы это иметь в виде функции. Что бы при желании ее можно было вставить в любой советник. И конечно эта задача имеет больше теоретический интерес, чем практический.
Ведь рандом - он и на то рандом, что при каждом проходе его значения будут отличаться от предыдущего.
Примерно так:
C-подобный:
//+------------------------------------------------------------------+
//| Random                                                           |
//+------------------------------------------------------------------+
int Random()
  {
    int res = // Получение рандомного значения
    
    return(res);
  }
Ф-ция Random вернет значение в указанном вами диапазоне, т.е., в боте будет примерно так:
int Signal = Random();
а далее, как вы делали, через if(Signal==0)....
 

ssg

Интересующийся
Примерно так:
C-подобный:
//+------------------------------------------------------------------+
//| Random                                                           |
//+------------------------------------------------------------------+
int Random()
  {
    int res = // Получение рандомного значения
  
    return(res);
  }
Ф-ция Random вернет значение в указанном вами диапазоне, т.е., в боте будет примерно так:
int Signal = Random();
а далее, как вы делали, через if(Signal==0)....
Понятно. Буду пробовать. Спасибо!
Я так делал у себя в советнике:
//+------------------------------------------------------------------+
//| все позиции и ордера |
//+------------------------------------------------------------------+
int Signal(){
int Res=-1;
int total=OrdersTotal();
for (int i=0;i<=total;i++) {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if (OrderSymbol()==Symbol()) {
if (OrderMagicNumber()==Magic) {
return(Res);
}
}
}
}
MathSrand(TimeLocal());
Res = MathRand();
while(Res<min) Res*=10;
while(Res>max) Res/=10;
return(Res);
}
//+------------------------------------------------------------------+
и дальше
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
int cmd=Signal();
//---

Теперь попробую как предложил AlexeyVik.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5

AlexeyVik, добрый вечер.​

Функция GetTickCount() возвращает количество миллисекунд - это функция для пятерки, а чем ее заменить в четверке?
Почаще читайте документацию -https://docs.mql4.com/ru/common/gettickcount
Поставь курсор на интересующую функцию, в данном случае на GetTickCount между любыми буквами этого слова и нажми F1… Так-же там можно прочесть о целесообразности установки начального состояния генератора случайных чисел…
Перед первым вызовом функции необходимо использовать функцию MathSrand, чтобы перевести генератор псевдослучайных чисел в начальное состояние.
Для гарантированного получения неповторяющейся последовательности используйте вызов MathSrand(GetTickCount())
И дальше пояснение для чего там GetTickCount -https://docs.mql4.com/ru/math/mathsrand
 

ssg

Интересующийся

AlexeyVik, добрый вечер.​

Спасибо за ответ.Может быть Вы не обратили внимание, но фраза:
Функция GetTickCount() возвращает количество миллисекунд..
как раз и взята из GetTickCount - Общие функции - Справочник MQL4 или Документация по MQL5: Общие функции / GetTickCount
Но все равно искреннее спасибо за участие.
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5

AlexeyVik, добрый вечер.​

Спасибо за ответ.Может быть Вы не обратили внимание, но фраза:
Функция GetTickCount() возвращает количество миллисекунд..
как раз и взята из GetTickCount - Общие функции - Справочник MQL4 или Документация по MQL5: Общие функции / GetTickCount
Но все равно искреннее спасибо за участие.
Ну так в сцильке-же чётко написано -https://docs.mql4.com/ru/math/mathsrand
 
Последнее редактирование модератором:

ssg

Интересующийся
AlexeyVik, еще раз спасибо за участие!
К стати , в пустой шаблон советника в онтик записал только предложенные Вами две строчки и добавил вывод соммент, запустил в тестере с визуализацией - работает!
 

AlexeyVik

Программист mql4 mql5
AlexeyVik, еще раз спасибо за участие!
К стати , в пустой шаблон советника в онтик записал только предложенные Вами две строчки и добавил вывод соммент, запустил в тестере с визуализацией - работает!
Это-ж надо……… Я хотел подсказать как не будет работать… и промахнулся…:)
 

блондинка

Элитный участник
вопрос к уважаемым спецам
есть такие части строчки кода
= High[iHighest(Symbol(),0,MODE_HIGH,10,i)];
= Low[iLowest (Symbol(),0,MODE_LOW, 10, i)];
как они работают мне понятно,это нахождение максимального хая и лоу свечи за период (тут 10)
мне интересно (хотелось бы увидеть) можно ли как то эту функцию приспособить например к осциллятору RSI(он ходит как известно в границах 0/100)
т.e. в расчете заменить хай и лоу на значения RSI
как будет это выглядеть (если возможно) подскажите пожалуйста
 
Верх