[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 477

 

demlin:
Еще вопрос: какой функцией можно вытащить стоимость одного пункта инструмента?

https://docs.mql4.com/ru/constants/marketinfo

MarketInfo(Symbol(), MODE_TICKVALUE);
 
LazarevDenis:

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

например, советник сработал, открылся ордер (дальше не интересует), нужно чтобы ордер больше не открывался на текущем баре на часовом таймфрейме

все выглядит примерно так:

int hh;
int CurrentHour;
CurrentHour=TimeHour(TimeCurrent());
if (CurrentHour!=hh)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Bid-3*Point,Bid+3*Point);
hh=TimeHour(TimeCurrent());
}

но у меня открывается бесчисленное количество ордеров

int hh = 0;
нужно установить перед start() и init()
 
Ребят, помогите найти советник для ручной торговли в тестере на истории. В кодебазе есть несколько, мне нужен тот, который управлялся перетаскиванием надписей в левом нижнем углу нрафика. Очень простой, не могу найти. HistTraining и Визуализация тестирования. Ручная торговля - не то. Очень постой советниче, там ещё можно было выставлять уровни, на которых тестирование останавливалось.
 
demlin:

Всем привет!

Подскажите, что сие означает:

Order buy ...... failed [Trade timeout]

Конкретно интересует что это за таймаут

https://www.mql5.com/ru/forum/112612
Это истек срок ожидания ответа от сервера --- открылась сделка или нет. Причем нет гарантий что сделка не открылась.

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

 

rlx:


нужно установить перед start() и init()


int hh = 0;
int init()
{
return(0);
}
int start()
{
//-------------------------------------------------
int countorder;
countorder=OrdersTotal();
if (countorder==0)
{
Alert ("открытых ордеров нет");
}else
{
Alert ("есть открытые ордера");
}
int hh;
int CurrentHour;
CurrentHour=TimeHour(TimeCurrent());
if ((CurrentHour!=hh)&&(countorder==0))
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Bid-3*Point,Bid+3*Point);
hh=TimeHour(TimeCurrent());
}
//-------------------------------------------------
return(0);
}

int deinit()
{
return(0);
}

сделал как сказали, не помогло, добавил учет количества открытых ордеров, теперь открывает ордера сразу после закрытия предидущего

я пошел в обход через OrderCloseTime(), вроде бы теперь работает

int countorder;
countorder=OrdersTotal();
if (countorder==0)
{
Alert ("открытых ордеров нет");
}else
{
Alert ("есть открытые ордера");
}
int hh;
int CurrentHour;
int LastOrderCloseTime;
CurrentHour=TimeHour(TimeCurrent());


OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);
hh=TimeHour(OrderCloseTime());


if ((CurrentHour!=hh)&&(countorder==0))
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Bid-3*Point,Bid+3*Point);
}

 
rlx:

https://www.mql5.com/ru/forum/112612
Это истек срок ожидания ответа от сервера --- открылась сделка или нет. Причем нет гарантий что сделка не открылась.

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

Спасибо за ответы
 
Roger:

Не хочется быть занудой, однако..

Объясните мне, как откроется ордер, если OrderTotal() равен нулю.

Спасибо.


Ниже рисунок, на котором отмечены скобки ограничиваюшие блок кода, который исполняется при условии

if(OrdersTotal()>0&&tral>0&&OrderMagicNumber()==MAGIC&&(OrderType()==OP_SELL||OrderType()==OP_BUY))

На операции OrderSend() это условие не влияет.

 

как получить номер бара, в "будущем" :)

ф-ция iBarShift() прекрасно работает для получения номера бара из истории, а как бы получить номер бара для вот такого кода, если сдвинуть линию вправо - за нулевой бар?

static string name_vline = "linescr";
//________________________________________________
int init(){
   DrawLine(name_vline,Time[5],Red);
return(0);
}
//________________________________________________
int deinit() {
return(0);
}
//________________________________________________
int start(){
   datetime X;
   X = ObjectGet(name_vline,OBJPROP_TIME1);
   Comment("Координата X = ",iBarShift(NULL,0,X),"\n",
           "Время = ",TimeToStr(X));
return(0);
}
//________________________________________________
void DrawLine(string name, datetime tim, color cl){
   ObjectCreate(name, OBJ_VLINE, 0, tim, Close[0], tim, Close[0]);
   ObjectSet(name, OBJPROP_BACK  , false);
   ObjectSet(name, OBJPROP_COLOR, cl);
   ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);      
   ObjectSet(name, OBJPROP_WIDTH, 0);
}
 
IgorM:

как получить номер бара, в "будущем" :)

ф-ция iBarShift() прекрасно работает для получения номера бара из истории, а как бы получить номер бара для вот такого кода, если сдвинуть линию вправо - за нулевой бар?

Можно получить смещение относительно Time[0]

shift = MathRound((Time[0] - X) / (Period()*60));
 
rlx:

Можно получить смещение относительно Time[0]

Спасибо! Теперь все ОК!

static string name_vline = "linescr";
//________________________________________________
int init(){
   DrawLine(name_vline,Time[5],Red);
return(0);
}
//________________________________________________
int deinit() {
return(0);
}
//________________________________________________
int start(){
   datetime X;
   X = ObjectGet(name_vline,OBJPROP_TIME1);
   if(X<=Time[0])
         Comment("Координата X = ",iBarShift(NULL,0,X),"\n",  "Время = ",TimeToStr(X));
   else
         Comment("Координата X = ",MathRound((Time[0] - X) / (Period()*60)),"\n","Время = ",TimeToStr(X));
return(0);
}
//________________________________________________
void DrawLine(string name, datetime tim, color cl){
   ObjectCreate(name, OBJ_VLINE, 0, tim, Close[0], tim, Close[0]);
   ObjectSet(name, OBJPROP_BACK  , false);
   ObjectSet(name, OBJPROP_COLOR, cl);
   ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);      
   ObjectSet(name, OBJPROP_WIDTH, 0);
} 
Причина обращения: