Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Нужна помощь опытных программистов!
Привет всем!
Ребят, нужна ваша помощь! Пишу себе одного советника. В программировании не особо силен, поэтому и обращаюсь. В общем, делаю проверочную функцию на установку лока к рыночным ордерам. Все ордера заносятся в структурный двумерный массив. Первый индекс (ячейка) массива [0] - это базовые(рыночные) ордера, второй индекс(ячейка) [1] - это локи к базовым ордерам. Так вот, функция должна выполнять проверку, установлен ли лок к базовому ордеру и, если - ДА, то мы ничего не делаем и работаем дальше, а если -НЕТ, то даем сигнал на установку соответствующего лока. Функцию я написал, но она работает как-то криво. Т.е., например, открывается рыночный ордер Buy, терминал выдает, что это тип ордера не BUY, а SELL и поэтому к нему надо выставить лок. А с SELL ордерами все работает правильно. Я ничего не могу понять. Ордера правильно записываются в массивы. Делал соответствующую проверку - все идеально. Все критерии ордера в массиве отражаются верно. Помогите найти ошибку в коде или как-то переделать мою функцию. Функцию прилагаю.
bool CheckOrders() // Есть массив с базовыми ордерами, открытыми по рынку InfoOrderNew[0][200]
{ // Есть массив с лок ордерами, выставленными к базовым InfoOrderNew[1][200]
int TypeOrder;
string Type = "",
OrderComm = "";
bool OpenLockOrder = false; // Флаг на установку лок ордера
for(int i=OrdersTotal()-1;i>=0;i--) // Выполняем перебор по рыночн. и отлож. ордерам
{
if((OrderSelect(i,SELECT_BY_POS) == true) // Если есть следующ.
&& (OrderSymbol() == Symbol())) // .. и наша вал.пара
{
OrderComm = OrderComment(); // Выбираем соответствующий комментарий ордера
TypeOrder = OrderType(); // Выбираем соответствующий тип ордера
for(int n=0; n<=199; n++) // Выполняем прогон по массиву ордеров
{
if(StringFind(OrderComm,"BaseIndex #"+IntegerToString(n)+"_",0)>=0) // Ищем базовый ордер с индексом в комментарии, соответствующем номеру ячейки в массиве ордеров
{
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_BUY) // Если находим и наш ордер в массиве является BUY
{
if(InfoOrderNew[1][n].TypeOrder == 1 || InfoOrderNew[1][n].TypeOrder == 5) // Проверяем, выставлен ли к нему лок ордер (SELL или SELLSTOP) в массиве лок ордеров
{
if(InfoOrderNew[1][n].TypeOrder == 1) Type = "Sell";
if(InfoOrderNew[1][n].TypeOrder == 5) Type = "SellStop";
if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
break; // Если лок выставлен, то выходим из функции
}
else // Если нет, то
{
if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
OpenLockOrder = true; // Даем сигнал на установку лока
}
}
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_SELL) // Если наш ордер в массиве является SELL
{
if(InfoOrderNew[1][n].TypeOrder == 0 || InfoOrderNew[1][n].TypeOrder == 4) // Проверяем, выставлен ли к нему лок ордер (BUY или BUYSTOP) в массиве лок ордеров
{
if(InfoOrderNew[1][n].TypeOrder == 0) Type = "Buy";
if(InfoOrderNew[1][n].TypeOrder == 4) Type = "BuyStop";
if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
break; // Если лок выставлен, то выходим из функции
}
else // Если нет, то
{
if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
OpenLockOrder = true; // Даем сигнал на установку лока
}
}
}
}
}
}
return(OpenLockOrder); // Передаем нашей функции полученное значение
}
Нужна помощь опытных программистов!
Привет всем!
Ребят, нужна ваша помощь! Пишу себе одного советника. В программировании не особо силен, поэтому и обращаюсь. В общем, делаю проверочную функцию на установку лока к рыночным ордерам. Все ордера заносятся в структурный двумерный массив. Первый индекс (ячейка) массива [0] - это базовые(рыночные) ордера, второй индекс(ячейка) [1] - это локи к базовым ордерам. Так вот, функция должна выполнять проверку, установлен ли лок к базовому ордеру и, если - ДА, то мы ничего не делаем и работаем дальше, а если -НЕТ, то даем сигнал на установку соответствующего лока. Функцию я написал, но она работает как-то криво. Т.е., например, открывается рыночный ордер Buy, терминал выдает, что это тип ордера не BUY, а SELL и поэтому к нему надо выставить лок. А с SELL ордерами все работает правильно. Я ничего не могу понять. Ордера правильно записываются в массивы. Делал соответствующую проверку - все идеально. Все критерии ордера в массиве отражаются верно. Помогите найти ошибку в коде или как-то переделать мою функцию. Функцию прилагаю.
bool CheckOrders() // Есть массив с базовыми ордерами, открытыми по рынку InfoOrderNew[0][200]
{ // Есть массив с лок ордерами, выставленными к базовым InfoOrderNew[1][200]
int TypeOrder;
string Type = "",
OrderComm = "";
bool OpenLockOrder = false; // Флаг на установку лок ордера
for(int i=OrdersTotal()-1;i>=0;i--) // Выполняем перебор по рыночн. и отлож. ордерам
{
if((OrderSelect(i,SELECT_BY_POS) == true) // Если есть следующ.
&& (OrderSymbol() == Symbol())) // .. и наша вал.пара
{
OrderComm = OrderComment(); // Выбираем соответствующий комментарий ордера
TypeOrder = OrderType(); // Выбираем соответствующий тип ордера
for(int n=0; n<=199; n++) // Выполняем прогон по массиву ордеров
{
if(StringFind(OrderComm,"BaseIndex #"+IntegerToString(n)+"_",0)>=0) // Ищем базовый ордер с индексом в комментарии, соответствующем номеру ячейки в массиве ордеров
{
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_BUY) // Если находим и наш ордер в массиве является BUY
{
if(InfoOrderNew[1][n].TypeOrder == 1 || InfoOrderNew[1][n].TypeOrder == 5) // Проверяем, выставлен ли к нему лок ордер (SELL или SELLSTOP) в массиве лок ордеров
{
if(InfoOrderNew[1][n].TypeOrder == 1) Type = "Sell";
if(InfoOrderNew[1][n].TypeOrder == 5) Type = "SellStop";
if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
break; // Если лок выставлен, то выходим из функции
}
else // Если нет, то
{
if(Debug) Print("Функция CheckOrders(): К ордеру Buy #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
OpenLockOrder = true; // Даем сигнал на установку лока
}
}
if((TypeOrder == InfoOrderNew[0][n].TypeOrder) == OP_SELL) // Если наш ордер в массиве является SELL
{
if(InfoOrderNew[1][n].TypeOrder == 0 || InfoOrderNew[1][n].TypeOrder == 4) // Проверяем, выставлен ли к нему лок ордер (BUY или BUYSTOP) в массиве лок ордеров
{
if(InfoOrderNew[1][n].TypeOrder == 0) Type = "Buy";
if(InfoOrderNew[1][n].TypeOrder == 4) Type = "BuyStop";
if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," найден Lock-ордер ",Type," #",InfoOrderNew[1][n].TicketOrder,".");
break; // Если лок выставлен, то выходим из функции
}
else // Если нет, то
{
if(Debug) Print("Функция CheckOrders(): К ордеру Sell #",InfoOrderNew[0][n].TicketOrder," не найден Lock-ордер. Необходимо его установить!");
OpenLockOrder = true; // Даем сигнал на установку лока
}
}
}
}
}
}
return(OpenLockOrder); // Передаем нашей функции полученное значение
}
Или покажите журнал распринтовки.
Или покажите журнал распринтовки.
Поставил. Ничего не изменилось. Вот записи из журнала событий:
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.23020 ok
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция SendMarketOrder(): Ордер отправлен успешно! Характеристики ордера: Buy#1; Цена открытия: 0.0; Лот: 0.1; Стоплосс: 0.0; Тейкпрофит: 0.0.
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: В работе функция ModifyOrder()
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder()
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder(): Торговый поток свободен!
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: modify #1 buy 0.10 GBPUSD at 1.23020 sl: 1.18020 tp: 1.23520 ok
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder(): Модификация ордера выполнена успешно!
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: В работе функция SetPendingOrder()
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция SetPendingOrder(): Выставленная цена SellStop ордера удовлетворяет условиям брокера.
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: open #2 sell stop 0.10 GBPUSD at 1.22020 ok
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция SetPendingOrder(): Отложенный ордер выставлен c 1-й попытки! Характеристики ордера: SellStop #2; Цена: 1.2202; Лот: 0.1.
2017.01.15 18:23:51.062 2017.01.03 04:15:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Отложенный SellStop ордер успешно установлен!
2017.01.15 18:23:51.109 2017.01.03 04:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет #2; Цена=1.2202; Тип=5; ячейка[0].
2017.01.15 18:23:51.109 2017.01.03 04:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет #1; Цена=1.2302; Тип=0; ячейка[0].
2017.01.15 18:23:51.109 2017.01.03 04:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество найденных ордеров = 2.
2017.01.15 18:23:51.109 2017.01.03 04:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество рыночных ордеров = 1.
2017.01.15 18:23:51.109 2017.01.03 04:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество Lock-ордеров = 1.
2017.01.15 18:23:51.109 2017.01.03 04:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell #1 не найден Lock-ордер. Необходимо его установить!
посмотрите в функцию где ВЫ заполняете массив InfoOrderNew[1][n].TypeOrder
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет #3; Цена=1.2287; Тип ордера=Sell; ячейка[1].
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет #2; Цена=1.2202; Тип ордера=SellStop; ячейка[0].
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет #1; Цена=1.2302; Тип ордера=Buy; ячейка[0].
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество найденных ордеров = 4.
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество рыночных ордеров = 2.
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество Lock-ордеров = 2.
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell #3 найден Lock-ордер BuyStop #4.
2017.01.15 23:09:48.234 2017.01.03 09:30:00 Multi-Trade System ver.1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell #1 не найден Lock-ордер. Необходимо его установить!
Спасибо Вам Vladislav Andruschenko за участие в поиске проблемы! Я вроде бы разобрался. Пришлось немного переделать код и все сразу заработало.
незачто
я просто немного выпал на выходные. :-) Хорошо что разобрались.
незачто
я просто немного выпал на выходные. :-) Хорошо что разобрались.
Еще возник такой вопрос:
Как обнулять или удалять информацию в какой-либо из ячеек структурного неоднородного массива? Дело в том, что у меня изменился комментарий к ордеру и мне надо этот ордер удалить из ячейки структурного массива и определить этот ордер в другой массив. С обычным массивом все более менее понятно, а вот со структурными, я не знаю, какие операторы или функции работают или как это все надо оформлять? И как копировать один структурный массив в другой, чтобы сохранить информацию о предыдущем заполнении и потом ее сравнивать с новым заполнением? Подскажите, кто что знает по этому поводу. Буду очень благодарен!
можно ли в ценовой метке (OBJ_ARROW_LEFT_PRICE) вместо цены вывести свой текст, если да то как?