Всем добрый день! Помогите пробить кирпичную стену!
Задача написать советник который открывает до 100 ордеров ставит с/л. и т/п. После преодоления определенного сигнального уровня ордера модифицируются с/л. и т/р. У каждого ордера свой индивидуальный сигнальный уровень, с/л. и т/р.
С/л. и т/п. для последующей модификации, рассчитывается в момент открытия ордера.
Свою задачу я решил использовав пример с книги Сергея Ковальова. Переработал под свои идеи.
Вчера советник заработал, торгует, ставит с/л. и т/п, модифицирует сл после преодоления ценой сигнального уровня. Я думал что проблему решил, оказалась что не до конца. На тестере советник открывает где то 15-30 ордеров и модифицирует как запланировано. Потом продолжает открывать и модифицировать ордера только с/л при модификации ставит 0. Почему так происходит не понимаю.
Народ помогите найти лажу!!!
Сори не успел полностью написать сообщение отвлекли.
Так вот: ниже приведен механизм учёта ордеров и их последующей модификации
// Учёт ордеров ArrayCopy(Mas_Ord_Old, Mas_Ord_New); Qnt = 0; ArrayInitialize(Mas_Ord_New,0); for(i=0; i<=OrdersTotal(); i++) // Цикл перебора ордер { if ((OrderSelect(i,SELECT_BY_POS) == true) && (OrderSymbol() == Symb)) //Если есть следующ ... и наша вал.пара { // Анализ ордеров: Qnt++; Mas_Ord_New[Qnt][1] = OrderOpenPrice(); Mas_Ord_New[Qnt][2] = OrderStopLoss(); Mas_Ord_New[Qnt][3] = OrderTakeProfit(); Mas_Ord_New[Qnt][4] = OrderTicket(); Mas_Ord_New[Qnt][5] = OrderLots(); Mas_Ord_New[Qnt][6] = OrderType(); Mas_Ord_New[Qnt][7] = OrderMagicNumber(); if (OrderComment()=="") Mas_Ord_New[Qnt][8] = 0; else Mas_Ord_New[Qnt][8] = 1; if (Mas_Ord_Old[Qnt][4] == Mas_Ord_New[Qnt][4] && Mas_Ord_Old[Qnt][2] == Mas_Ord_New[Qnt][2] && Mas_Ord_Old[Qnt][11] == 0) { Mas_Ord_New[Qnt][9] = Mas_Ord_Old[Qnt][9]; Mas_Ord_New[Qnt][10] = Mas_Ord_Old[Qnt][10]; } else if (Mas_Ord_Old[Qnt][4] == Mas_Ord_New[Qnt][4] && Mas_Ord_Old[Qnt][2] == Mas_Ord_New[Qnt][2] && Mas_Ord_Old[Qnt][11] == 1) { Mas_Ord_New[Qnt][9] = 0; Mas_Ord_New[Qnt][10] = 0; } Mas_Ord_New[Qnt][11] = Mas_Ord_Old[Qnt][11]; } } Mas_Ord_New[0][0] = Qnt; // Слежение за событиями for (int old = 1; old <= Mas_Ord_Old[0][0]; old++) { for (int new = 1; new <= Mas_Ord_New[0][0]; new++) { if (Mas_Ord_Old[old][11] == 0 && Mas_Ord_New[new][11] == 0) { if (Mas_Ord_New[new][6] == 0) { if (Mas_Ord_Old[old][4] == Mas_Ord_New[new][4] && Mas_Ord_Old[old][2] == Mas_Ord_New[new][2] && Bid > Mas_Ord_New[new][9]) { AnsModify = false; Price = Mas_Ord_New[new][1]; SL = Mas_Ord_New[new][10]; TP = Mas_Ord_New[new][3]; Ticket= Mas_Ord_New[new][4]; Alert("???!!!! Попытка модификации Buy: Ticket: ",Ticket,"; Price: ",Price,"; SL: ",SL,"; TP: ",TP,". Ждём ответ....."); for(i=0; i<=OrdersTotal(); i++) { if (OrderSelect(i-1,SELECT_BY_POS)==true) / { if (OrderSymbol()!=Symb)continue; if (OrderType()>1)continue; if (OrderTicket()== Ticket) { AnsModify=OrderModify(Ticket,Price,SL,TP,0); Alert("Модифицирован ордер Buy||| Ticket: ",Ticket,"; Price: ",Price,"; SL: ",SL,"; TP: ",TP); Mas_Ord_New[new][11] = 1; } } } if (AnsModify==true) { Print ("Функция OrderModify: Ордер № ",Ticket," модифицирован:) ПОЛУЧИЛОСЬ:)))"); if (OrderSelect(Ticket,SELECT_BY_POS)==true) { Ticket_Ord =OrderTicket(); PriceModify =OrderOpenPrice(); SL_Ord =OrderStopLoss(); TP_Ord =OrderTakeProfit(); Alert(" ПОЛУЧИЛОСЬ:))) Модифицирован ордер Buy||| Ticket: ",Ticket_Ord,"; Price: ",PriceModify,"; SL: ",SL_Ord,"; TP: ",TP_Ord); } } else { Fun_Erorr=GetLastError(); Print("GetLastError OP_SELL == ", Fun_Erorr); } } } else if (Mas_Ord_New[new][6] == 1) { if (Mas_Ord_Old[old][4] == Mas_Ord_New[new][4] && Mas_Ord_Old[old][2] == Mas_Ord_New[new][2] && Ask < Mas_Ord_New[new][9]) { ... здесь тоже самое только для ордеров sell } } } } } //--------------------------------------------------------------- 5 --
Проблема выглядит так:
Сори не успел полностью написать сообщение отвлекли.
Так вот: ниже приведен механизм учёта ордеров и их последующей модификации
Проблема выглядит так:
В вашем коде не видно размеров массивов: Mas_Ord_Old и Mas_Ord_New
Обратите внимание: переменная new выделена. Скоро в языке появится этот оператор, так что поторопитесь изменить имя переменной.
Возможно, ошибка в этой строке:
SL = Mas_Ord_New[new][10];
В вашем коде не видно размеров массивов: Mas_Ord_Old и Mas_Ord_New
Обратите внимание: переменная new выделена. Скоро в языке появится этот оператор, так что поторопитесь изменить имя переменной.
double Mas_Ord_Old[131][12], Mas_Ord_New[131][12];
С начало было
double Mas_Ord_Old[31][12], Mas_Ord_New[31][12];
Но у меня стоит ограничение на количество одновременно открытых ордеров не больше 10
Возможно, ошибка в этой строке:
SL = Mas_Ord_New[new][10];
Нет там правильно. Наверное надо дать пояснения к элементам массива, и так:
Mas_Ord_New[Qnt][1] = OrderOpenPrice(); Mas_Ord_New[Qnt][2] = OrderStopLoss(); Mas_Ord_New[Qnt][3] = OrderTakeProfit(); Mas_Ord_New[Qnt][4] = OrderTicket(); Mas_Ord_New[Qnt][5] = OrderLots(); Mas_Ord_New[Qnt][6] = OrderType(); Mas_Ord_New[Qnt][7] = OrderMagicNumber(); Mas_Ord_New[Qnt][8] = ; Определения состояния комментария - 0 нет коммента, 1 -есть (наверное надо убрать) Mas_Ord_New[Qnt][9] = ; Сигнальный уровень, как только цена его пересекла должен быть модифицирован ордер Mas_Ord_New[Qnt][10] = ; Новый Стоп/Лосс для модифицируемого ордера Mas_Ord_New[Qnt][11] = ; Индикатор модификации если = 0 то ордер можно модифицировать если = 1 то уже модифицирован и проверка поданному ордеру не производится
Хочу добавить,что значение для элементов массива
Mas_Ord_New[Qnt][9] = ; Сигнальный уровень, как только цена его пересекла должен быть модифицирован ордер Mas_Ord_New[Qnt][10] = ; Новый Стоп/Лосс для модифицируемого ордера Mas_Ord_New[Qnt][11] = ; Индикатор модификации если = 0 то ордер можно модифицировать если = 1 то уже модифицирован и проверка поданному ордеру не производится
присваивается в момент открытия ордера и больше ни где не изменяются.
У меня возник вот такой вопрос, ордер был открыт по условиям, потом по условиям модифицирован и закрылся по с/л. или т/п. то почему на его местов массиве не происходит запись нового ордера или если ордеров не добавилось то они должны поменять свой порядковый номер: ордер № 3 закрыт ордер № 4 стал ордером № 3?
else if (Mas_Ord_Old[Qnt][4] == Mas_Ord_New[Qnt][4] && Mas_Ord_Old[Qnt][2] == Mas_Ord_New[Qnt][2] && Mas_Ord_Old[Qnt][11] == 1) { Mas_Ord_New[Qnt][9] = 0; Mas_Ord_New[Qnt][10] = 0;Только этот участок кода может приводить к нулевому стоплосу. Попробуйте туда вписать что-то другое.
Только этот участок кода может приводить к нулевому стоплосу. Попробуйте туда вписать что-то другое.
Точно.
Сначала в Mas_Ord_New[new][9] пишется ноль, а потом с ним сравнивается Bid:
if (Mas_Ord_Old[old][4] == Mas_Ord_New[new][4] && Mas_Ord_Old[old][2] == Mas_Ord_New[new][2] && Bid > Mas_Ord_New[new][9])
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем добрый день! Помогите пробить кирпичную стену!
Задача написать советник который открывает до 100 ордеров ставит с/л. и т/п. После преодоления определенного сигнального уровня ордера модифицируются с/л. и т/р. У каждого ордера свой индивидуальный сигнальный уровень, с/л. и т/р.
С/л. и т/п. для последующей модификации, рассчитывается в момент открытия ордера.
Свою задачу я решил использовав пример с книги Сергея Ковальова. Переработал под свои идеи.
Вчера советник заработал, торгует, ставит с/л. и т/п, модифицирует сл после преодоления ценой сигнального уровня. Я думал что проблему решил, оказалась что не до конца. На тестере советник открывает где то 15-30 ордеров и модифицирует как запланировано. Потом продолжает открывать и модифицировать ордера только с/л при модификации ставит 0. Почему так происходит не понимаю.
Народ помогите найти лажу!!!