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

griz

Активный участник
Если я Вас правильно понял, Вы пишите, что при нажатии на кнопку(на советнике) будет открыт ордер. Да, будет. Но ордер будет открыт советником. А мне это не нужно. Мне нужно, чтобы ордер был открыт вручную.

Когда открыт ордер, если подвести курсор можно увидеть кем был открыт ордер. И мне нужно чтобы ордер был открыт вручную, а не экспертом.
 

dj152

Новичок форума
Подскажите пожалуйста как получить направление стрелки индикатора из другого индикатора или советника? Пробовал iCustom но там данные не меняются, исходников индикатора не мог найти, только ex4
1598589640705.png
 

Вложения

AlexeNP

Гуру форума
Если я Вас правильно понял, Вы пишите, что при нажатии на кнопку(на советнике) будет открыт ордер. Да, будет. Но ордер будет открыт советником. А мне это не нужно. Мне нужно, чтобы ордер был открыт вручную.

Когда открыт ордер, если подвести курсор можно увидеть кем был открыт ордер. И мне нужно чтобы ордер был открыт вручную, а не экспертом.
берешь и прописываешь магический номер = 0...
 

Ugar

Гуру форума
Как с помощью mql4 можно устанавливать объем ордера в окне "Торговля в один клик"?

Например, индикатор с кнопкой просчитывает объем ордера. И при нажатии на кнопку просчитанный объем отправляется в окно "Торговля в один клик". И вручную уже открываешь сделку, или выставляешь лимитку. Т.е. чтобы руками не вбивать объем ордера.
Придётся сооружать кликер. Для этого mql4 не хватит. В целях безопасности такого функционала нет в языке. Придётся выходить за пределы mql4. Для этого повозиться с виндовыми библиотеками. ИМХО эта идея не стоит этой возни.
 

ivansss

Новичок форума
Уважаемые программисты вновь прошу совета. Вопрос касается получения информации по закрытому ордеру в MQL5.

После выбора тикета HistoryOrderGetTicket непонятно, как получить время открытия и закрытия ордера корректно.
Работаю через - HistoryOrderGetInteger - ENUM_PROPERTY_INTEGER. И вот тут начинается совершенна каша. Какой идентификатор брать - беру ORDER_TIME_SETUP, фигня. С временем закрытия вообще не ясно.
 

AlexeyVik

Программист mql4 mql5
Уважаемые программисты вновь прошу совета. Вопрос касается получения информации по закрытому ордеру в MQL5.

После выбора тикета HistoryOrderGetTicket непонятно, как получить время открытия и закрытия ордера корректно.
Работаю через - HistoryOrderGetInteger - ENUM_PROPERTY_INTEGER. И вот тут начинается совершенна каша. Какой идентификатор брать - беру ORDER_TIME_SETUP, фигня. С временем закрытия вообще не ясно.
Самое основное отличие mql4 и mql5 это понятия ордер, сделка и позиция. Для mql4 есть только ордера, а для mql5 такая последовательность:
ордер—>сделка—>позиция затем закрываем, была позиция—>ордер—>сделка—>нет позиции.
У каждой позиции есть идентификатор POSITION_IDENTIFIER который присутствует у каждого ордера и каждой сделки участвующих в открытии\закрытии позиции. Чтобы получить информацию по закрытой позиции надо получить список ордеров и сделок по этому идентификатору
Код:
Expand Collapse Copy
bool  HistorySelectByPosition(
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER
   );
Но!!! Если позиция уже закрыта, то получить этот идентификатор можно только из сделки или ордера с этим идентификатором.
Вот выдержка из документации
Свойства позиций
Идентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция.
 

ivansss

Новичок форума
Уважаемые программисты, возник еще один каверзный вопрос. Записываю данные в СSV файл. Код такой:


void handle_write(int handle,int Op_order)
{
double ordinate_1[3],ordinate_2[3],ordinate_3[3],ordinate_4[3];
int k = 0;

for(int i = Op_order; i < Op_order + 3; i ++)
{
ordinate_1[k] = (double)NormalizeDouble((iClose(_Symbol,PERIOD_CURRENT,i) - iOpen(_Symbol,PERIOD_CURRENT,i)),Digits());

if(iClose(_Symbol,PERIOD_CURRENT,i) > iOpen(_Symbol,PERIOD_CURRENT,i)){ordinate_2[k] = (double)NormalizeDouble((iHigh(_Symbol,PERIOD_CURRENT,i) - iClose(_Symbol,PERIOD_CURRENT,i)),Digits());}
if(iClose(_Symbol,PERIOD_CURRENT,i) < iOpen(_Symbol,PERIOD_CURRENT,i)){ordinate_2[k] = (double)NormalizeDouble((iHigh(_Symbol,PERIOD_CURRENT,i) - iOpen(_Symbol,PERIOD_CURRENT,i)),Digits());}
if(iClose(_Symbol,PERIOD_CURRENT,i) == iOpen(_Symbol,PERIOD_CURRENT,i)){ordinate_2[k] = (double)NormalizeDouble(0,Digits());}

if(iClose(_Symbol,PERIOD_CURRENT,i) > iOpen(_Symbol,PERIOD_CURRENT,i)){ordinate_3[k] = (double)NormalizeDouble((iOpen(_Symbol,PERIOD_CURRENT,i) - iLow(_Symbol,PERIOD_CURRENT,i)),Digits());}
if(iClose(_Symbol,PERIOD_CURRENT,i) < iOpen(_Symbol,PERIOD_CURRENT,i)){ordinate_3[k] = (double)NormalizeDouble((iClose(_Symbol,PERIOD_CURRENT,i) - iLow(_Symbol,PERIOD_CURRENT,i)),Digits());}
if(iClose(_Symbol,PERIOD_CURRENT,i) == iOpen(_Symbol,PERIOD_CURRENT,i)){ordinate_3[k] = (double)NormalizeDouble(0,Digits());}

ordinate_4[k] = (double)NormalizeDouble((iVolume(_Symbol,PERIOD_CURRENT,i)),Digits());
k++;
}
FileWrite(handle,
ordinate_1[0],ordinate_2[0],ordinate_3[0],ordinate_4[0],
ordinate_1[1],ordinate_2[1],ordinate_3[1],ordinate_4[1],
ordinate_1[2],ordinate_2[2],ordinate_3[2],ordinate_4[2]);
FileClose(handle);
}


Проблема в том что значения пишутся в файл то с точкой, то с запятой. Еще и в разном формате. Как записать все с точкой? Язык - mql5
 

Вложения

  • 1111.JPG
    1111.JPG
    244,1 КБ · Просмотры: 13

MrGreen86

Гуру форума
Проблема в том что значения пишутся в файл то с точкой, то с запятой. Еще и в разном формате. Как записать все с точкой? Язык - mql5
они пишутся с точкой. проверить это просто, откройте файл в блокноте после записи, там все будет с точками.
У вас в excel все тоже с точками. Но когда Excel делает сокращения используя эпсилон, он начинает это писать с запятой. Даже не знаю, но думаю что это можно гдето настроить в excel или в операционной системе.
Но это на самом деле не важно. При записи обрезайте данные с помощью DoubleToString:
Код:
Expand Collapse Copy
FileWrite(handle,
DoubleToString(ordinate_1[0],_Digits),DoubleToString(ordinate_2[0],_Digits),DoubleToString(ordinate_3[0],_Digits),DoubleToString(ordinate_4[0],_Digits),
DoubleToString(ordinate_1[1],_Digits),DoubleToString(ordinate_2[1],_Digits),DoubleToString(ordinate_3[1],_Digits),DoubleToString(ordinate_4[1],_Digits),
DoubleToString(ordinate_1[2],_Digits),DoubleToString(ordinate_2[2],_Digits),DoubleToString(ordinate_3[2],_Digits),DoubleToString(ordinate_4[2],_Digits));
FileClose(handle);
А вот NormalizeDouble там где вы записываете данные в массивы, можете убрать, он там бесполезен.
 

ivansss

Новичок форума
При записи обрезайте данные с помощью DoubleToString
Спасибо. Помогло.
Возник еще один неприятный момент. Аналогичный код в mql4 писал это все в utf-8, mql5, как я понял пишет в utf16le.
Добавка к FileOpen CP_UTF8 не решает проблемы.

Решить я пытаюсь следующее, закинуть в питон данные:
r_x = np.array(pd.read_csv(file_name, header = None, sep = ';'))
Пишет:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Пересохранение файла csv в utf8 проблемы не решает. Добавление кодировки:
r_x = np.array(pd.read_csv(file_name, header = None, sep = ';',encoding = "utf16"))
Пишет:
'utf-16-le' codec can't decode byte 0x30 in position 2: truncated data
Заколдованный круг....
 

AlexeyVik

Программист mql4 mql5
Спасибо. Помогло.
Возник еще один неприятный момент. Аналогичный код в mql4 писал это все в utf-8, mql5, как я понял пишет в utf16le.
Добавка к FileOpen CP_UTF8 не решает проблемы.

Решить я пытаюсь следующее, закинуть в питон данные:
r_x = np.array(pd.read_csv(file_name, header = None, sep = ';'))
Пишет:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Пересохранение файла csv в utf8 проблемы не решает. Добавление кодировки:
r_x = np.array(pd.read_csv(file_name, header = None, sep = ';',encoding = "utf16"))
Пишет:
'utf-16-le' codec can't decode byte 0x30 in position 2: truncated data
Заколдованный круг....
Попробуй поставить флаг FILE_ANSI и если не поможет, проверь с флагом FILE_UNICODE одно из двух должно помочь.
 

sergeysv

Активный участник
Приветствую.!
Помогите пожалуйста решить задачу в Spoiler ,
а то уже неделю раскурить не могу:)
Тут пытался:

, так и не получилось т.к предложенные варианты не совсем то что нужно...

for (iL=OrdersTotal()-1;iL>=0;iL--)
{
if (OrderSelect(iL, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic_15) continue;
if (OrderType()==OP_BUYSTOP) bs++;
if (OrderType()==OP_BUY) BuyPos++;
}
}
if( /* Сигнал купить*/ )
{
if( bs== 0 && BuyPos == 0 )
{
// Открытие bs
} }
// Сигнал купить ещё актуален и в рынке 1 BUYSTOP
// Сигнал купить не актуален и обратного сигнала продать нет -- в рынке 1 BUY
// Сигнал купить опять актуален и в рынке 1 BUYSTOP и 1 BUY
if( bs == 0 && BuyPos > 0)
{
if( bs == 0)
{
if( /* Сигнал купить*/ )
{
// Открытие bs
} }}
// Сигнал купить не актуален и обратного сигнала продать нет -- в рынке 1 BUY и 1 BUYSTOP
// Сигнал купить опять актуален-----
//Как продолжать открывать по 1 BUYSTOP при наличии Сигнала купить независимо
// от количества ордеров BUYSTOP и ордеров BUY ?
 
Последнее редактирование модератором:

sergeysv

Активный участник
задачу опишите без спойлеров и левых кодов.

Ситуация такая ,что сигнал к покупке появляется на 10 минутном чарте.
Далее он может пройти без обратного сигнала в продажи..т.е зависнуть во флэте 10,20, 30,40,50 ит.д мин ..Потом опять появиться.- и так далее пока не появиться сигнал на продажу.

Есть сигнал на бай:
Устанавливается один BUYSTOP (один сигнал =один ордер)
Нужно при наличии одного сигнала и следующих сигналов к покупке продолжать открывать по одному BUYSTOP независимо от общего количества ордеров BUYSTOP
и возможно активированных ордеров BUY .

В спойлере рабочий вариант который удалось добиться :
один сигнал =один BUYSTOP;
второй сигнал--BUYSTOP не открывается если не активирован BUY.
второй сигнал--если активирован BUY то BUYSTOP открывается.
 

MrGreen86

Гуру форума
Ситуация такая ,что сигнал к покупке появляется на 10 минутном чарте.
Далее он может пройти без обратного сигнала в продажи..т.е зависнуть во флэте 10,20, 30,40,50 ит.д мин ..Потом опять появиться.- и так далее пока не появиться сигнал на продажу.

Есть сигнал на бай:
Устанавливается один BUYSTOP (один сигнал =один ордер)
Нужно при наличии одного сигнала и следующих сигналов к покупке продолжать открывать по одному BUYSTOP независимо от общего количества ордеров BUYSTOP
и возможно активированных ордеров BUY .

В спойлере рабочий вариант который удалось добиться :
один сигнал =один BUYSTOP;
второй сигнал--BUYSTOP не открывается если не активирован BUY.
второй сигнал--если активирован BUY то BUYSTOP открывается.
ну и хорошо. что сделать то надо?
 

sergeysv

Активный участник
ну и хорошо. что сделать то надо?
Как сделать чтобы при наличии одного сигнала и следующих сигналов к покупке продолжать открывать по одному BUYSTOP независимо от общего количества ордеров BUYSTOP
и возможно активированных ордеров BUY .?
 

MrGreen86

Гуру форума
Как сделать чтобы при наличии одного сигнала и следующих сигналов к покупке продолжать открывать по одному BUYSTOP независимо от общего количества ордеров BUYSTOP
и возможно активированных ордеров BUY
.?
ответ в вашем вопросе - не обращать внимание на общее количество ордеров BUYSTOP и возможно активированный ордеров BUY
Код:
Expand Collapse Copy
if(/* Сигнал купить*/)
  {
   // покупаем
  }
 

sergeysv

Активный участник
ответ в вашем вопросе - не обращать внимание на общее количество ордеров BUYSTOP и возможно активированный ордеров BUY
Код:
Expand Collapse Copy
if(/* Сигнал купить*/)
  {
   // покупаем
  }
Пробовал. Открывает огромное количество отложек на первом сигнале.
 

MrGreen86

Гуру форума
Пробовал. Открывает огромное количество отложек на первом сигнале.
сделайте что бы сигнал был 1 на свече, или так:

Код:
Expand Collapse Copy
static datetime last_signal = 0;
if(/* Сигнал купить*/ && Time[0] > last_signal)
  {
   last_signal = Time[0];
   // покупаем
  }
 

sergeysv

Активный участник
сделайте что бы сигнал был 1 на свече, или так:

Код:
Expand Collapse Copy
static datetime last_signal = 0;
if(/* Сигнал купить*/ && Time[0] > last_signal)
  {
   last_signal = Time[0];
   // покупаем
  }
Пробывал. Не подходит.
Так же пробывал свечу с другого тайфрейма. Не подходит.
Пробывал цену последнего ордера минус или плюс дистанцию в пунктах. Не подходит.
Пробывал время последнего ордера. Не подходит. :-)
 
Верх