Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Есть вопросы по сервису MQL5 Cloud Network? FAQ поможет!
ruslan
30
ruslan 2006.03.28 18:50 
ПРивет.
ПОдскажите пожалуйста - как в коде советника делается запрос о наличии отложенного ордера на определенном уровне. Нужно просто проверять - есть ли он там вобще.

Заранее благодарен за ответ.
. ... Rick D. ... .
1074
. ... Rick D. ... . 2006.03.28 19:33  
Смотреть самому. По всем ордерам в цикле.
ruslan
30
ruslan 2006.03.28 21:59  
А чтобы в советнике эту функцию прописать?
. ... Rick D. ... .
1074
. ... Rick D. ... . 2006.03.28 22:44  
Попробую еще раз. Смотреть самому. По всем ордерам в цикле.

l.ruslan:
А чтобы в советнике эту функцию прописать?
ruslan
30
ruslan 2006.03.29 07:07  
Лдано... мне кажется вы думаете что разговариваете с програмистом. НЕт...я врач :)
Просто иногда увлекаюсь форексом. ВОт решил советник написать. Но... не получается.
Пытаюсь найти помощь, но тоже не получается :)
Евгений Панин
702
Евгений Панин 2006.03.29 14:36  
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); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж

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

//+------------------------------------------------------------------+
//| 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" относится только к уже открытым ордерам (а не отложенным). ВОбщем я тут запутался маленько. Если есть возможно написать массив именно для этой небольшой програмки - помогите пожалуйста. Мне это не под силу :(
А если етсь какая-то другая ошибка - покажите ее. Я ничего найти не могу. Скорее всего у меня недостаточно знаний для этого.
Zaebali_Suki2
39
Zaebali_Suki2 2012.08.14 05:18  

ПРИВЕТ ФОРУМНЫЕ ПИДОРАСЫ!!!
НЕ ПОРА ЛИ С УТРЕЦА,
ХУЙ СОСУНУТЬ ВАМ С ЛЕГОНЦА?
(ПОРА ПОРА)

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