Ваши вопросы по языку MQL4

liana 123

Прохожий
Ордер не открывается. В чем ошибка?

Здравствуйте,
Посмотрите пожалуйста, в чем ошибка - ордер не открывается. Мне нужно проверить, что нет отложеных и открытых ордеров и только тогда открыть ордера.
Я отталкивалась от этого примера.
http://book.mql4.com/ru/samples/expert

[NOTE]string Symb;
int Total, Ticket, Lts;
int start()

{
Symb=Symbol();
Total=0;
for(int i=1; i<=OrdersTotal(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symb)continue;
if (OrderType()>1)
{
return;
}
Total++;
if (Total>1)
{
return;
}
}
else
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,3,0,0,"",567,0,Red);
Ticket=OrderSend(Symb,OP_BUYSTOP,Lts,Ask+10*Point,3,0,0,"",567,0,Green);

}
return;
}[/NOTE]
 

Ugar

Гуру форума
Здравствуйте,
Посмотрите пожалуйста, в чем ошибка - ордер не открывается. Мне нужно проверить, что нет отложеных и открытых ордеров и только тогда открыть ордера.
Я отталкивалась от этого примера.
_http://book.mql4.com/ru/samples/expert

[NOTE]string Symb;
int Total, Ticket, Lts;
int start()

{
Symb=Symbol();
Total=0;
for(int i=1; i<=OrdersTotal(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symb)continue;
if (OrderType()>1)
{
return;
}
Total++;
if (Total>1)
{
return;
}
}
else
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,3,0,0,"",567,0,Red);
Ticket=OrderSend(Symb,OP_BUYSTOP,Lts,Ask+10*Point,3,0,0,"",567,0,Green);

}
return;
}[/NOTE]
Попробуй так:
Код:
int start() 
{   
//Объявили переменную
int Ticket;
//Объявили и назначили символ
string Symb=Symbol();
//Объявили и назначили количество ордеров
int Total=OrdersTotal();
//Цикл перебора ордеров
for(int i=0; i<Total; i++)
    {      
    //Выбор ордера
    if (OrderSelect(i,SELECT_BY_POS)==true)
       {
       Если ордер чужого символа пропускаем
       if (OrderSymbol()!=Symb)continue;
       //Если есть ордер, открытый или отложенный выход
       return(0);
       }
    }
//Если добрались до сюда значит нет ордеров. Открываем.
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,3,0,0,"",567,0,Red); 
if(Ticket<0)Print("Ордер не открыт, ошибка ",GetLastError);
Ticket=OrderSend(Symb,OP_BUYSTOP,Lts,Ask+10*Point,3,0,0,"",567,0,Green);
if(Ticket<0)Print("Ордер не установлен, ошибка ",GetLastError);
}
А если не будет открываться, можно посмотреть ошибку в журнале и понять почему.
 
Последнее редактирование модератором:

real

Новичок форума
Уважаемые программисты!

Помогите с кодом. Что нужно вставить, чтобы советник работал только на демо-счетах?

Заранее благодарен.
 

Nata_FX

Активный участник
Функцией IsDemo
PHP:
 if(IsDemo()) Print("Я работаю на демонстрационном счете");
  else Print("Я работаю на реальном счете");
 

vetallic

Местный знаток
Хелп, запарился с проблемой очистки...

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

Прикол в том что прога не стирает старую надпись а пишет новую поверх старой, все проходи только после переключения таймов... :question:

int init()
{
ObjectsDeleteAll();
IndicatorShortName("BS");
IndicatorDigits(5);
IndicatorBuffers(85);

SetIndexBuffer(0, Buffer310);

ObjCount += 1;
TextObj310 = "IChart_" + ObjCount;
ObjectCreate(TextObj310, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj310, OBJPROP_CORNER, 0);
ObjectSet(TextObj310, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj310, OBJPROP_YDISTANCE, 80);

ObjCount += 1;
TextObj311 = "IChart_" + ObjCount;
ObjectCreate(TextObj311, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj311, OBJPROP_CORNER, 0);
ObjectSet(TextObj311, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj311, OBJPROP_YDISTANCE, 80);

....

int deinit()
{
ObjectsDeleteAll();
return(0);
}

START...

 

hitkill

Активный участник
как описать функцию if с условием:
если предыдущий ордер в истории сэлл то открыть бай, если бай то открыть сэлл?
заранее спасибо!
 

Ugar

Гуру форума
как описать функцию if с условием:
если предыдущий ордер в истории сэлл то открыть бай, если бай то открыть сэлл?
заранее спасибо!
Если последний ордер в истории известен, то узнать его тип не проблема.
Например если тип исторического ордера в переменной LastHistoryOrderType, то:
if(LastHistoryOrderType==OP_BUY)
{
открыть sell
}
и аналогично наоборот
 

Ugar

Гуру форума
Хелп, запарился с проблемой очистки...

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

Прикол в том что прога не стирает старую надпись а пишет новую поверх старой, все проходи только после переключения таймов... :question:

int init()
{
ObjectsDeleteAll();
IndicatorShortName("BS");
IndicatorDigits(5);
IndicatorBuffers(85);

SetIndexBuffer(0, Buffer310);

ObjCount += 1;
TextObj310 = "IChart_" + ObjCount;
ObjectCreate(TextObj310, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj310, OBJPROP_CORNER, 0);
ObjectSet(TextObj310, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj310, OBJPROP_YDISTANCE, 80);

ObjCount += 1;
TextObj311 = "IChart_" + ObjCount;
ObjectCreate(TextObj311, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj311, OBJPROP_CORNER, 0);
ObjectSet(TextObj311, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj311, OBJPROP_YDISTANCE, 80);

....

int deinit()
{
ObjectsDeleteAll();
return(0);
}

START...

С объектами в init() могут быть проблемы. Дело в том что пока индюк не запущен ему не известно его окно.
Попробуй жёстко задать номер окна в удалялке ордеров. Может поможет.
А можно всю эту лабоду с объектами перенести в start().
Например
bool ini;
int init()
{
ini=true;
return(0);
}

int start()
{
if(ini)
{
лабуда с объектами
}
ini=false;
далее остальной код индюка

return(0);
}
 

Ugar

Гуру форума
Ну объекты же в 0 окно кидаешь, так и задай 0 окно.
ObjectsDeleteAll(0);
За одно можно и тип объектов задать.
int ObjectsDeleteAll( int window=EMPTY, int type=EMPTY)Удаление всех объектов с указанным типом и в указанном подокне графика. Функция возвращает число удаленных объектов. Для получения дополнительной информации об ошибке необходимо вызвать функцию функцию GetLastError().
Замечания: нумерация подокон графика (если на графике есть подокна с индикаторами) начинается с 1. Главное окно графика есть всегда и имеет индекс 0. Если индекс окна отсутствует или имеет значение -1, то объекты удаляются со всего графика.
Если значение параметра type равно -1 или этот параметр отсутствует, то удаляются все объекты из указанного подокна. Параметры:
window - Необязательный параметр. Индекс окна, на котором будут удалены объекты. Должен быть большим или равным -1 (EMPTY, значение по умолчанию) и меньшим, чем WindowsTotal(). type - Необязательный параметр. Тип объекта для удаления. Это может быть любое из значений списка идентификаторов типов объектов или EMPTY (-1) для удаления всех объектов. Пример:
ObjectsDeleteAll(2, OBJ_HLINE); // удаляются все горизонтальные линии из 2-го подокна.
ObjectsDeleteAll(2); // удаляются все объекты из 2-го подокна.
ObjectsDeleteAll(); // удаляются все объекты с графика.
 

Artyomfm

Интересующийся
Kак с помощью winapi запретить изменение счета, тоест как советнику узнат что юзер изменил счет

int deinit()
{
switch(UninitializeReason())
{
case REASON_ACCOUNT:
///....
break;
}
}
как это ргеализироват в winapi
 

vetallic

Местный знаток
Ugar
не выходит :-(

и прописывал окна и тип объекта... мож с самого начала лажанулся гдет?

// local variables
int ObjCount = 0;
int current = 0;

string TextObj93 = "";
double Buffer93[];
string TextObj85 = "";
double Buffer85[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
ObjectsDeleteAll(0, OBJ_LABEL);
ObjectsDeleteAll(TextObj93, OBJ_LABEL);
ObjectsDeleteAll(TextObj85, OBJ_LABEL);
IndicatorDigits(5);
IndicatorBuffers(12);

SetIndexBuffer(0, Buffer93);

ObjCount += 1;
TextObj93 = "IChart_" + ObjCount;
ObjectCreate(TextObj93, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj93, OBJPROP_CORNER, 0);
ObjectSet(TextObj93, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj93, OBJPROP_YDISTANCE, 20);

SetIndexBuffer(1, Buffer85);

ObjCount += 1;
TextObj85 = "IChart_" + ObjCount;
ObjectCreate(TextObj85, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj85, OBJPROP_CORNER, 0);
ObjectSet(TextObj85, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj85, OBJPROP_YDISTANCE, 20);


return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectsDeleteAll();

return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator start function |
//+------------------------------------------------------------------+
int start()

...
 
Последнее редактирование модератором:

Ugar

Гуру форума
Ugar
не выходит :-(

и прописывал окна и тип объекта... мож с самого начала лажанулся гдет?

// local variables
int ObjCount = 0;
int current = 0;

string TextObj93 = "";
double Buffer93[];
string TextObj85 = "";
double Buffer85[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
ObjectsDeleteAll(0, OBJ_LABEL);
ObjectsDeleteAll(TextObj93, OBJ_LABEL);
ObjectsDeleteAll(TextObj85, OBJ_LABEL);
IndicatorDigits(5);
IndicatorBuffers(12);

SetIndexBuffer(0, Buffer93);

ObjCount += 1;
TextObj93 = "IChart_" + ObjCount;
ObjectCreate(TextObj93, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj93, OBJPROP_CORNER, 0);
ObjectSet(TextObj93, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj93, OBJPROP_YDISTANCE, 20);

SetIndexBuffer(1, Buffer85);

ObjCount += 1;
TextObj85 = "IChart_" + ObjCount;
ObjectCreate(TextObj85, OBJ_LABEL, 0, 0, 0);
ObjectSet(TextObj85, OBJPROP_CORNER, 0);
ObjectSet(TextObj85, OBJPROP_XDISTANCE, 1);
ObjectSet(TextObj85, OBJPROP_YDISTANCE, 20);


return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectsDeleteAll();

return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator start function |
//+------------------------------------------------------------------+
int start()

...
Попробуй так
Код:
int init()
{
Print("Объектов до удаления =", ObjectsTotal());
    ObjectsDeleteAll();  
Print("Объектов после удаления =", ObjectsTotal());

    IndicatorDigits(5);
    IndicatorBuffers(12);
...
Может яснее станет. Объекты удаляются нормально.
Только вот дальше не понятно.
Зачем вешаются 2 объекта на одни координаты?
Почему не видно где задан текст этих лейблов?
 
Последнее редактирование модератором:

vetallic

Местный знаток
на одни координаты у меня 12 объектов, просто при смене тренда информация меняется...

void TechnicalAnalysis2x87()
{
if ((iMA ....
{
ChartText93();

}
}

void ChartText93()
{
Buffer93[current]= 0;
ObjectSetText(TextObj93, "PRINT DATA1" + DoubleToStr(NormalizeDouble(Buffer93[current], 1), Digits), 10, "Arial", Red);

}
 

Ugar

Гуру форума
на одни координаты у меня 12 объектов, просто при смене тренда информация меняется...

void TechnicalAnalysis2x87()
{
if ((iMA ....
{
ChartText93();

}
}

void ChartText93()
{
Buffer93[current]= 0;
ObjectSetText(TextObj93, "PRINT DATA1" + DoubleToStr(NormalizeDouble(Buffer93[current], 1), Digits), 10, "Arial", Red);

}
В общем проблема не в том что объекты не удаляются. Они удаляются как положено. Проблема где то в налепленных объектах на одну координату.
Обычно, на одной координате, принято вешать один объект.
 

vetallic

Местный знаток
Ugar

но ведь в других индюках такой же принцип действий, на одной координате по пару текстов...
вот и ломаю голову :question:
 

hitkill

Активный участник
помогите пожалуйста...где ошибка?)



int start()
{
//----
if (OrdersTotal()>0)
{
int ticket;
int ordertype;
double profit;
profit=OrderProfit();
ordertype=OrderType();
ticket=OrderTicket();
if (ordertype==OP_BUY && profit>12 * MarketInfo(Symbol(),MODE_POINT))
{
OrderSelect(ticket, SELECT_BY_TICKET);
OrderModify(ticket,OrderOpenPrice(), OrderOpenPrice() + 10 * MarketInfo(Symbol(),MODE_POINT),0,0,Blue);
}
if (ordertype==OP_SELL && profit>12 * MarketInfo(Symbol(),MODE_POINT))
{
OrderSelect(ticket, SELECT_BY_TICKET);
OrderModify(ticket,OrderOpenPrice(), OrderOpenPrice() - 10 * MarketInfo(Symbol(),MODE_POINT),0,0,Blue);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
 

Ugar

Гуру форума
помогите пожалуйста...где ошибка?)



int start()
{
//----
if (OrdersTotal()>0)
{
int ticket;
int ordertype;
double profit;
profit=OrderProfit();
ordertype=OrderType();
ticket=OrderTicket();

if (ordertype==OP_BUY && profit>12 * MarketInfo(Symbol(),MODE_POINT))
{
OrderSelect(ticket, SELECT_BY_TICKET);
OrderModify(ticket,OrderOpenPrice(), OrderOpenPrice() + 10 * MarketInfo(Symbol(),MODE_POINT),0,0,Blue);
}
if (ordertype==OP_SELL && profit>12 * MarketInfo(Symbol(),MODE_POINT))
{
OrderSelect(ticket, SELECT_BY_TICKET);
OrderModify(ticket,OrderOpenPrice(), OrderOpenPrice() - 10 * MarketInfo(Symbol(),MODE_POINT),0,0,Blue);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Откуда программа может узнать параметры какого ордера присваивать переменным. А дальше, естественно, ничего работать не будет, так как код использует эти переменные, а их значения не верны.
Это будет работать если предварительно выбрать ордер, тем самым указать программе о каком ордере идёт речь.
 

vadim2490

Активный участник
Здрасвуите! Очень хочу понять как по этим строкам сова генерирует ключ. Посмотрите плс кто понимает.

int li_24;
if (Key == "пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ" || Key == "") {
gi_380 = FALSE;
Print("пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅп їЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ");
if (ObjectFind(gs_key_384) == -1) ObjectCreate(gs_key_384, OBJ_LABEL, 0, 0, 0);
ObjectSet(gs_key_384, OBJPROP_CORNER, 1);
ObjectSet(gs_key_384, OBJPROP_XDISTANCE, 5);
ObjectSet(gs_key_384, OBJPROP_YDISTANCE, 15);
ObjectSetText(gs_key_384, "пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅп їЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ!", 10, "Tahoma", Red);
} else {
li_24 = StrToInteger(StringSubstr(Key, 0, StringLen(Key) - 2)) / gi_396 + 57;
gi_392 = StrToInteger(StringSubstr(Key, StringLen(Key) - 2, 2)) / StrToInteger(StringSubstr(Key, 0, 1));
if (AccountNumber() == li_24 || IsDemo() == TRUE || IsOptimization() == TRUE || IsTesting() == TRUE) {
gi_380 = TRUE;
Print("пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ!");
gs_key_384 = "label";
if (ObjectFind(gs_key_384) == -1) ObjectCreate(gs_key_384, OBJ_LABEL, 0, 0, 0);
ObjectSet(gs_key_384, OBJPROP_CORNER, 1);
ObjectSet(gs_key_384, OBJPROP_XDISTANCE, 5);
ObjectSet(gs_key_384, OBJPROP_YDISTANCE, 15);
ObjectSetText(gs_key_384, "пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ!", 10, "Tahoma", Lime);
MaxLots = 130.0 * Lots;
 
Верх