MQL4 - automated forex trading   /  

Форум

Учёт ордеров

К списку тем Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
87
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. Более того, вся переписка с клиентами автоматически распознается и попадает в архив, где ее без труда можно найти в будущем.


avatar
1739
getch 21.11.2009 21:02 

Есть несколько вариантов решения. Самый простой - через MagicNumber.

Учитывайте, что иногда бывают неочевидные нюансы при закрытии.


avatar
87
hope 21.11.2009 21:33 
Хммм.. и как задать в условии закрытия (OrderClose) какой тикет закрыть по Магик N (сейчас последний тикет BTic_i - последний тикет, вроде как)??? Интересно, что при первом (частичном) закрытии советник нашёл его, а после смены номера тикета нет. Нюансы я просматривал - наподобии, что появился сигнал закрытия первой позиции и начался конфликт - ничего такого нет.

avatar
668
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);

}


avatar
268
Swan 21.11.2009 22:54 
hope >>:

Добрый вечер. Помогите, пожалуйста, с поиском последнего ордера. Суть такова: допустим есть две открытые позиции объемом по два лота. Наступает условие частичного закрытия второй позиции (условия закрытия первой позиции ещё не наступили) - тут всё срабатывает - вторая позиция частично закрыта (т.е. тут поиск последнего имеющегося ордера сработал). Второй сигнал наступает на закрытие второй части второй позиции - и выдаётся ошибка 4108 "Неизвестный тикет". Код поиска позиций стандартный:

Я понимаю, что номер тикета второй позиции сменился, но не понимаю почему блок поиска его не находит (это моё подозрение на блок поиска - может я не прав). Обращение к закрытию ордеров тоже стандартное:

Как найти вторую позицию если её номер тикета сменился?

В приведенном коде выбирается последний лот по списку, что не совсем правильно. Лучше по наибольшему тикету.

Код выполняется после частичного закрытия и перед закрытием второй части второй позиции?

Посмотрите откуда таки берётся "Неизвестный тикет", самое простое:

Print(BTic_i);
Ans=OrderClose(BTic_i,Lots0,Price_ClsB,5,Red);

avatar
2132
kombat 21.11.2009 23:00 

а если маджик назначать дататайм дату?



avatar
159
hasayama 22.11.2009 00:36 

А блок поиска точно вызывается после того как сработало частичное закрытие? Или все же у вас просто хранятся в переменных устаревшие данные? У меня такое случалось))

Лучший способ в мета эдиторе что-то проверить на работоспособность - распечатывать принты о каждом действии в тестере. Попробуйте печатать и возможно найдете свой проезд.


avatar
84
anat 23.11.2009 17:13 

У меня вопрос не по вопросу топикстартера в надежде, что получится хорошая подборка практических кодов по учету ордеров. Задача: надо открыть несколько ордеров (задаётся пользователем) в одном направлении торговли по одному в разное время по приходу сигналов. Достигнув, заданного количества ордеров, открытие новых прекращается пока все позиции не закроются по стопу или тейку. То есть надо учет позиций делать в цикле, достигли заданного количества, включается реверс счетчика и он считает позиции до нуля, после чего открытие позиций снова разрешается.

К списку тем  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий