| / | Форум |
|
hope
21.11.2009 20:45
Добрый вечер. Помогите, пожалуйста, с поиском последнего ордера. Суть такова: допустим есть две открытые позиции объемом по два лота. Наступает условие частичного закрытия второй позиции (условия закрытия первой позиции ещё не наступили) - тут всё срабатывает - вторая позиция частично закрыта (т.е. тут поиск последнего имеющегося ордера сработал). Второй сигнал наступает на закрытие второй части второй позиции - и выдаётся ошибка 4108 "Неизвестный тикет". Код поиска позиций стандартный: // 2.Цикл for-учёт количества имеющихся ордеров от начала к концу Symb=Symbol(); // Название фин.инстр. BTot_i=0; // Количество бай ордеров STot_i=0; // Количество сел ордеров BTLts_i=0; STLts_i=0; for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм Tip_i=OrderType(); Tot_i++; if (Tip_i==0) { BTot_i++; BTic_i=OrderTicket(); BPri_i=OrderOpenPrice(); BLts_i=OrderLots(); BTLts_i+=OrderLots(); BProf_i=OrderProfit(); } if (Tip_i==1) { STot_i++; STic_i=OrderTicket(); SPri_i=OrderOpenPrice(); SLts_i=OrderLots(); STLts_i+=OrderLots(); SProf_i=OrderProfit(); } } } // Заваршён цикл for-учтены имеющиеся ордера от начала к концу-завершено на последнем ордере Я понимаю, что номер тикета второй позиции сменился, но не понимаю почему блок поиска его не находит (это моё подозрение на блок поиска - может я не прав). Обращение к закрытию ордеров тоже стандартное: Ans=OrderClose(BTic_i,Lots0,Price_ClsB,5,Red);Как найти вторую позицию если её номер тикета сменился? |
|
Организуйте багтрекинг и техсаппорт для своей компании В TeamWox имеются все для того чтобы организовать багтрекинг. Интегрировав модуль Сервисдеск с веб-сайтом, Вы сможете получать заявки своих клиентов напрямую в TeamWox. Более того, вся переписка с клиентами автоматически распознается и попадает в архив, где ее без труда можно найти в будущем. |
|
getch
21.11.2009 21:02
Есть несколько вариантов решения. Самый простой - через MagicNumber. Учитывайте, что иногда бывают неочевидные нюансы при закрытии. |
|
hope
21.11.2009 21:33
Хммм.. и как задать в условии закрытия (OrderClose) какой тикет закрыть по Магик N (сейчас последний тикет BTic_i - последний тикет, вроде как)??? Интересно, что при первом (частичном) закрытии советник нашёл его, а после смены номера тикета нет. Нюансы я просматривал - наподобии, что появился сигнал закрытия первой позиции и начался конфликт - ничего такого нет.
|
|
forex-k
21.11.2009 22:21
hope >>:
Хммм.. и как задать в условии закрытия (OrderClose) какой тикет закрыть по Магик N (сейчас последний тикет BTic_i - последний тикет, вроде как)??? Интересно, что при первом (частичном) закрытии советник нашёл его, а после смены номера тикета нет. Нюансы я просматривал - наподобии, что появился сигнал закрытия первой позиции и начался конфликт - ничего такого нет. действительно по магику вариант идеальный! для бай присвойте один магик а для селл другой а затем по магику Вы сможете определить и тикет и лот и все остальное и еще советую разбить поиск нужных переменных на отдельные функции так будет проще вот пример таких функций extern int magicBUY=12345; extern int magicSELL=54321; //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ double Orderprofit(int Magic){double j=0;for (int i=0;i<OrdersTotal();i++) {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) {if(OrderMagicNumber()==Magic)j=OrderProfit();} }return(j);} //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ double OrderOpenPricE(int Magic) {double j=0;for (int i=0;i<OrdersTotal();i++) {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) {if(OrderMagicNumber()==Magic)j=OrderOpenPrice();} }return(j);} //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ int tiket(int Magic) {int j=0;for (int i=0;i<OrdersTotal();i++) {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) {if(OrderMagicNumber()==Magic)j=OrderTicket();} }return(j);} //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ int lot(int Magic) {int j=0;for (int i=0;i<OrdersTotal();i++) {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) {if(OrderMagicNumber()==Magic)j=OrderLots();} }return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ int start() { . . . . Ans=OrderClose(tiket(magicBUY),lot(magicBUY),OrderOpenPricE(magicBUY),5,Red); } |
|
Swan
21.11.2009 22:54
hope >>:
Добрый вечер. Помогите, пожалуйста, с поиском последнего ордера. Суть такова: допустим есть две открытые позиции объемом по два лота. Наступает условие частичного закрытия второй позиции (условия закрытия первой позиции ещё не наступили) - тут всё срабатывает - вторая позиция частично закрыта (т.е. тут поиск последнего имеющегося ордера сработал). Второй сигнал наступает на закрытие второй части второй позиции - и выдаётся ошибка 4108 "Неизвестный тикет". Код поиска позиций стандартный: Я понимаю, что номер тикета второй позиции сменился, но не понимаю почему блок поиска его не находит (это моё подозрение на блок поиска - может я не прав). Обращение к закрытию ордеров тоже стандартное: Как найти вторую позицию если её номер тикета сменился?В приведенном коде выбирается последний лот по списку, что не совсем правильно. Лучше по наибольшему тикету. Код выполняется после частичного закрытия и перед закрытием второй части второй позиции? Посмотрите откуда таки берётся "Неизвестный тикет", самое простое: Print(BTic_i); Ans=OrderClose(BTic_i,Lots0,Price_ClsB,5,Red); |
|
kombat
21.11.2009 23:00
а если маджик назначать дататайм дату? |
|
hasayama
22.11.2009 00:36
А блок поиска точно вызывается после того как сработало частичное закрытие? Или все же у вас просто хранятся в переменных устаревшие данные? У меня такое случалось)) Лучший способ в мета эдиторе что-то проверить на работоспособность - распечатывать принты о каждом действии в тестере. Попробуйте печатать и возможно найдете свой проезд. |
|
anat
23.11.2009 17:13
У меня вопрос не по вопросу топикстартера в надежде, что получится хорошая подборка практических кодов по учету ордеров. Задача: надо открыть несколько ордеров (задаётся пользователем) в одном направлении торговли по одному в разное время по приходу сигналов. Достигнув, заданного количества ордеров, открытие новых прекращается пока все позиции не закроются по стопу или тейку. То есть надо учет позиций делать в цикле, достигли заданного количества, включается реверс счетчика и он считает позиции до нуля, после чего открытие позиций снова разрешается. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий