Как сделать запрос о наличии отложенного ордера на уровне?

 
ПРивет.
ПОдскажите пожалуйста - как в коде советника делается запрос о наличии отложенного ордера на определенном уровне. Нужно просто проверять - есть ли он там вобще.

Заранее благодарен за ответ.
 
Смотреть самому. По всем ордерам в цикле.
 
А чтобы в советнике эту функцию прописать?
 
Попробую еще раз. Смотреть самому. По всем ордерам в цикле.

l.ruslan:
А чтобы в советнике эту функцию прописать?
 
Лдано... мне кажется вы думаете что разговариваете с програмистом. НЕт...я врач :)
Просто иногда увлекаюсь форексом. ВОт решил советник написать. Но... не получается.
Пытаюсь найти помощь, но тоже не получается :)
 
l.ruslan:
ПРивет.
ПОдскажите пожалуйста - как в коде советника делается запрос о наличии отложенного ордера на определенном уровне. Нужно просто проверять - есть ли он там вобще.
Наличие ордера проверяется не на "определённом уровне".
Чтобы выяснить где расположен ордер, необходимо:
1. Обратиться к терминалу и прочитать (и запомнисть) все имеющиеся ордера.
2. Пройтись по имеющимся ордерам и найти интересующий.

На мой взгляд лучше (удобнее) работать с массивом.
Вот так можно прочитать все ордера. А потом, обращаясь к массиву, выяснить что угодно.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int AG_Terminal_scr() { Kol=0; // Обнуление старого количества ордеров ArrayInitialize(Mas_Ord_Tek,0); // Обнуление массива //================================================================================================ Анализ ордеров ==== for (i=1; i<=OrdersTotal(); i++) // По всем ордерам терминала { if((OrderSelect(i-1, SELECT_BY_POS)==true) && (OrderSymbol()==Symbol())) // Если есть следующий и наша вал.пара { Kol++; // Считаем общее количество ордеров //--------------------------------------------------------------------------- Формирование нового массива ордеров ---- Mas_Ord_Tek[Kol][1] = NormalizeDouble( OrderOpenPrice() ,Digits); // Курс открытия ордера Mas_Ord_Tek[Kol][2] = NormalizeDouble( OrderStopLoss() ,Digits); // Курс SL Mas_Ord_Tek[Kol][3] = NormalizeDouble( OrderTakeProfit(),Digits); // Курс ТР Mas_Ord_Tek[Kol][4] = OrderTicket(); // Номер ордера Mas_Ord_Tek[Kol][5] = OrderLots(); // Количество лотов Mas_Ord_Tek[Kol][6]= OrderType(); // Тип ордера Mas_Ord_Tek[Kol][7] = OrderMagicNumber(); // Магическое число ордера //-------------------------------------------------------------------------------------------------------------------- } } Mas_Ord_Tek[0][0] = Kol; // Сохраняем в нулевую ячеечку //==================================================================================================================== return(1); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж

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

//+------------------------------------------------------------------+
//| Trade50.mq4 |
//| Copyright © 2006, Cherednichenko W. A |
//| http://www. |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Cherednichenko W. A"
#property link "http://www.";

#include <WinUser32.mqh>//для MessageBox()


extern double Lot = 0.1;
extern double Spread = 4;
extern double Step = 50;
extern double StartValue = 1.75;
extern double HighLevel01 = 300;
extern double LowLevel01 = 300;
extern double HighLevel02 = 400;
extern double LowLevel02 = 400;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double TakeProfit = Step-Spread;
static bool run_once = false;
static int sym_digits;
if (run_once == false)
{
sym_digits = MarketInfo(Symbol(), MODE_DIGITS); // число разрядов после десятичной точки
run_once = true;
}

bool buy_stop = true;
bool buy_limit = true;
bool sell_stop = true;
bool sell_limit = true;
double ticket = 0;
int ttl = OrdersTotal();
int cnt = 0;
for( cnt=0;cnt<ttl;cnt++ ){
if( OrderSelect( cnt, SELECT_BY_POS ) == true)
{
if ((Bid + Step * Point) == OrderOpenPrice()) {sell_limit = false; }
if ((Bid - Step * Point) == OrderOpenPrice()) {sell_stop = false; }
if ((Ask + Step * Point) == OrderOpenPrice()) {buy_stop = false; }
if ((Ask - Step * Point) == OrderOpenPrice()) {buy_limit = false; }
}
}
RefreshRates();
if ( MathMod(Bid / Point,Step) == 0)
{
if ( (Bid < StartValue + HighLevel02 * Point) && (Bid > StartValue - LowLevel02 * Point))
{
if ( Bid > StartValue + HighLevel01 * Point)
{
if (sell_limit == true)ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lot, Bid + Step*Point, 3, 0, NormalizeDouble(Bid + Spread*Point, sym_digits), "My order #", 16384, 0, Green);
}
if ( Bid < StartValue - LowLevel01 * Point)
{
if (buy_limit == true)ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lot, Ask-Step*Point, 3, 0, NormalizeDouble(Ask - Spread*Point, sym_digits), "My order #", 16384, 0, Green);
}
if (buy_stop == true) ticket = OrderSend(Symbol(), OP_BUYSTOP, Lot, Ask+Step*Point, 3, 0, NormalizeDouble(Ask + TakeProfit*Point + Step*Point, sym_digits), "My order #", 16384, 0, Green);
if (sell_limit == true) ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lot, Bid+Step*Point, 3, 0, NormalizeDouble(Bid + Spread*Point, sym_digits), "My order #", 16384, 0, Green);
if (buy_limit == true) ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lot, Ask-Step*Point, 3, 0, NormalizeDouble(Ask - Spread*Point, sym_digits), "My order #", 16384, 0, Green);
if (sell_stop == true) ticket = OrderSend(Symbol(), OP_SELLSTOP, Lot, Bid-Step*Point, 3, 0, NormalizeDouble(Bid - TakeProfit * Point - Step* Point, sym_digits), "My order #", 16384, 0, Green);
}
}
}
//+------------------------------------------------------------------+
Постоянно контролируется наличие ордеров вверху над курсом и внизу. Если есть - тогда заносится в память. ОТкрытие идет только по ордерам кратным шагу ( if ( MathMod(Bid / Point,Step) == 0) )
Но.... наблюдается некоторое необьяснимое (для меня) явление. Если выбирать допустим на фунт/долларе шаг 20, 30 или 40 - то все идет нормально. Но если 50 или 100... да и 41 например - тогда начинается масированое открытие ордеров на одном уровне. Если допустить что советник в строке
if ((Bid + Step * Point) == OrderOpenPrice()) {sell_limit = false; }
проверяет только открытые ордера - тогда почему он работает при шаге 20 или 40 корректно?
Но с другой стороны мне кажется что "OrderOpenPrice" относится только к уже открытым ордерам (а не отложенным). ВОбщем я тут запутался маленько. Если есть возможно написать массив именно для этой небольшой програмки - помогите пожалуйста. Мне это не под силу :(
А если етсь какая-то другая ошибка - покажите ее. Я ничего найти не могу. Скорее всего у меня недостаточно знаний для этого.