Мне кажется что твой код вернёт кол-во пунктов или первого, или последнего открытого ордера. Не хочу возвращаться к твоему коду, а так не помню направление перебора. Ведь там просто перебор ордеров и определение расстояния с присвоением этого значения переменной р.)) Да ладно, человек пишет код, значит должен что-то волочь в этой теме.
А вообще да.
Свой код не проверял, но думаю что должен ворачивать наименьшее кол-во пунктов из открытых ордеров по символу и мэджику. В любую сторону.
fot(int i=0; i<OrdersTotal(); i++)
{
int p=0;
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(OrderSymbol()==_Symbol)
if(OrderMagicNumber()==mn)
{
if(OrderType()==OP_BUY)
if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0)
p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)
if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0)
p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point;
}
return(p);
}
но показатель всегда пишет 0. На счет при этом открыт ордер 0.10 с просадкой -60.int i;
int p;
int fot(int i=0); i<OrdersTotal(); i++) {
int p=0;
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(OrderSymbol()==_Symbol)
{
if(OrderType()==OP_BUY)
if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0)
p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)
if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0)
p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point;
}
return(p);
}
//-----------
int start() // Спец. функция start()
{
Comment("Показатель ",p,"");
}
Ну, да... Я не заметил сравнения с р. Поэтому я всегда ставлю пробелы. Конечно в таком, новом виде код будет работать правильно. А вот другой вариант этой функции:Там же проверка стоит. Если новое расстояние меньше, то берем его.Код:fot(int i=0; i<OrdersTotal(); i++) { int p=0; if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if(OrderSymbol()==_Symbol) if(OrderMagicNumber()==mn) { if(OrderType()==OP_BUY) if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0) p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point; if(OrderType()==OP_SELL) if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0) p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point; } return(p); }
Присвоил по умолчанию ноль и поправил условия.
Вобщем хозяин вопроса - проверяй и напиши что не так )
double f_00()
{
int p=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, && OrderSymbol() == _Symbol && OrderMagicNumber() == mn))
p = p > 0
? MathMin(р, MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID)))
: MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID));
}
return(p);
}
Конечно если тебе важно в каком направлении отклонение от цены открытия, то надо делить по типу ордера.Спасибо за внимание matro3 и AlexeyVik! Все равно не работает, я скомпилировал в таком виде, добавил глобальные переменные, без них компилятор ругается и вырезал проверку магика
но показатель всегда пишет 0. На счет при этом открыт ордер 0.10 с просадкой -60.
int minPP()
{
fot(int i=0; i<OrdersTotal(); i++)
{
int p=0;
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(OrderSymbol()==_Symbol)
if(OrderMagicNumber()==mn)
{
if(OrderType()==OP_BUY)
if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0)
p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)
if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0)
p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point;
}
}
return(p);
}
int start()
{
Comment("Показатель ",minPP(),"");
}
Он компилироваться не мог. Как я ни старался, скобки были не парными, переменная р должна быть double а я её оставил как у matro3 типом int потому и выдавал всегда 0. Вот проверенный вариант в виде скрипта.Вот, спасибо! Я все это время не так функцию подставлял, в этом и вся проблема!!! Испытал свой первоначальный вариант, он функционирует! Если интересно - Ваш вариант при компиляции выдает следующие ошибки, вариант AlexeyVik компилируется, но выдает всегда 0. Еще раз благодарю за внимание и помощь!
/********************************************************************\
//| !!! ScrTest.mq4 |
//| Copyright 2014, Viktorov |
//| [email protected] |
\********************************************************************/
#property copyright "Copyright 2014, Viktorov"
#property link "[email protected]"
#property version "1.00"
#property strict
void OnStart()
{/*******************Script program start function*******************/
double p = 0;
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == _Symbol)
p = p > 0
? MathMin(p, MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID)))
: MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID));
}
Alert((int)(p/Point));
}/*******************************************************************/
for(int i=0;i>=kol-1;i++) // Цикл открытия отложенных ордеров
{
ask2=Ask+r1*Point + r2*i*Point; // Рассчитываем размер позиции для каждой итерации
bid2=Bid-r1*Point - r2*i*Point; // Рассчитываем размер позиции для каждой итерации
ord=OrderSend(Symbol(),OP_BUYSTOP,lot2,ask2,slippage,0,0,NULL,magic,0,clrNONE); // открываем ордер BUYSTOP
ord=OrderSend(Symbol(),OP_SELLSTOP,lot2,bid2,slippage,0,0,NULL,magic,0,clrNONE); // открываем ордер SELLSTOP
}
А условие при котором начинается цикл???Уважаемые, вопрос жизни и смерти
Данный код, по идее, должен выставлять сетку из отложенных ордеров, но почему-то вообще ничего не происходит. В журнале даже никаких сообщений об ошибках не появляется. Кто-нибудь может подсказать, почему он не работает?
неУважаемые, вопрос жизни и смерти
Данный код, по идее, должен выставлять сетку из отложенных ордеров, но почему-то вообще ничего не происходит. В журнале даже никаких сообщений об ошибках не появляется. Кто-нибудь может подсказать, почему он не работает?
...
for(int i=0;i>=kol-1;i++)
for(int i=0;i<=kol-1;i++)
Вся проблема заключается в том, что void OnTick() выполняется только при поступлении нового тика. Так если последний тик был за 0.5 секунды до завершения бара, а следующий поступил только через 2 секунды нового бара, то и откроется новый бар через 2 секунды, и соответственно void OnTick() будет обработана в это-же время. А поскольку определить локальное время так-же как и время сервера можно только при поступлении тика, то эти пляски с бубном не дадут положительного результата.Добрый день, товарищи программисты.
В сети много раз встречал функции по определению времени до конца текущего бара. Но все они работали с TimeCurrent, через серверное время. Это вызывает задержку таймера, т.к. тик приходит не каждую секунду и время таймера останавливается. Или получается отрицательное время, по той же причине, что новый бар уже есть, а время еще не обновилось... Советник работает через OnTimer (обновляется каждую секунду, а не с новым тиком).
Прошу подсказать, возможно ли реализовать таймер оставшегося времеи до закрытия текущей свечи через TimeLocal, обновление которого происходит каждую секунду и обновляется при открытии новой свечи. Что-то пробовал, но при первом запуске советника, таймер показываел полное время до закрытия, хотя уже прошло половина свечи.
Можно уместить такие рассчеты в пределах функции, без внешних переменных?
Большое спасибо!
Так сработает, но новый бар появится только с первым тиком нового бара. Последи за графиком и временем. Бар появляется не тогда когда закончилось время бара, а когда приходит тик. И соответственно все расчёты связанные с барами работают не правильно.Так не сработает?Код:int OnInit() { if(!EventSetTimer(int seconds) GetLastError(); return(INIT_SUCCEEDED); } void OnTimer() { // какой-то код } void OnDeinit() { EventKillTimer(); }
input int timerSeconds = 1;
MqlDateTime str1;
int OnInit()
{
EventSetTimer(timerSeconds);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
EventKillTimer();
Comment("");
}
void OnTick()
{
}
void OnTimer()
{
TimeLocal(str1);
Comment(str1.sec);
}