Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#576

Вопрос к программистам. Есть переменная которая имеет значение, но когда терминал перезагружается , то значение теряется. Возможно ли запоминать это значение, после перезагрузки мт4.

#577

Привет, может у кого есть или кто нибудь может помочь мне написать функцию которая :

Например,если стоит BuyStop,цена до него доходит и он преврашается в маркет ордер, то автоматически отлаживается противоположный SellStop
ордер в другом направлении на определенном расстоянии,потом если цена доходить до етого SellStop ордера ,также снова открывается противоположный ордер,и цикл повторяется.
Спасибо.

#578


Вопрос к программистам. Есть переменная которая имеет значение, но когда терминал перезагружается , то значение теряется. Возможно ли запоминать это значение, после перезагрузки мт4.


Возможно. Сохранять значения во внешних файлах и при инициализации считывать настройки.
_http://codebase.mql4.com/ru/1025
#579


Привет, может у кого есть или кто нибудь может помочь мне написать функцию которая :

Например,если стоит BuyStop,цена до него доходит и он преврашается в маркет ордер, то автоматически отлаживается противоположный SellStop
ордер в другом направлении на определенном расстоянии,потом если цена доходить до етого SellStop ордера ,также снова открывается противоположный ордер,и цикл повторяется.
Спасибо.


Советник Чебурашка на форуме Альпари.
#580

Как можно узнать дистанцию от OrderOpenPrice() до 100 пипсовых круглых чисел?спасибо.

#581

max = 1000;
min = 0;
for (i=min; i {
if(OrderOpenPrice() - i {
low = i; high = i+100*Point;
lengthtolow = OrderOpenPrice() - low;
lengthtohigh = high - OrderOpenPrice();
break;
}
}

как то так.

#582

Сложновато предложили... Можно сделать без циклов и прочего, кажется вот так должно работать:

extern int Quality=100;- качество настраиваемого уровня
int mod=MathFloor(OrderOpenPrice()/(Quality*Point));
int ToLow=(OrderOpenPrice()-mod*Quality*Point)/Point;
int ToHigh=((mod+1)*Quality*Point-OrderOpenPrice())/Point;


Хотя сколько программистов столько и мнений :)
#583

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

Спойлер


void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (mn po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice() pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
double ff= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ff, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss() pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
double fd= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, fd, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
}
}
}
}
}

#584


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

Спойлер


void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (mn po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice() pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
double ff= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ff, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss() pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
double fd= OrderOpenPrice();
ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, fd, Slippage, 0, 0, "", Magic, 0, Red);
}
}
}
}
}
}
}
}




так по коду и должно быть: кол-во новых ордеров = кол-ву открытых ордеров (каждый шаг цикла новый ордер).
поставь return(); после строчки ticket = OrderSend...

Изменено 5 декабря, 2013 пользователем shatun

#585
Ricedeni
Если нужен один, значит нужно так и написать: если ордеров (допустим) BuyStop нет, значит, ставим.
Функции подсчёта ордеров есть в уроках.
И лучше написать: if (OrderModify(.........) - т.е., если ордер модифицирован, значит, ставим отложку.
#586


Ricedeni
Если нужен один, значит нужно так и написать: если ордеров (допустим) BuyStop нет, значит, ставим.



а если buystop есть, но по другим ценам?
#587
Ricedeni
Значит нужно внести нужную цену в переменную и по этой цене, больше не открывать.
#588


Ricedeni
Значит нужно внести нужную цену в переменную и по этой цене, больше не открывать.


внести цену в переменную я могу, а как потом проверить, что Buystop уже есть по этой цене?
#589
Ricedeni
Функцию нужно писать.
Перебор ордеров.
Если символ, магик, тип (Buystop), цена (OrderOpenPrice()) = нашей переменной...
Да - не ставим ордер, нет - ставим.
#590


внести цену в переменную я могу, а как потом проверить, что Buystop уже есть по этой цене?



Ну так а видеоуроки зачем писались? Вот например универсальная функция для проверки любых "наших" ордеров в рынке:

int CountTrades(int ordertype)   
{
int Count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == ordertype)
Count ++;
}
}

return (Count);
}


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

if (CountTrades(BUY_STOP) > 0)
то делаем то-то и то-то


Сделать подобную функцию проверки цен ордеров тоже не составит труда.

Изменено 5 декабря, 2013 пользователем JR

#591

спасибо друзья

#592

у меня вот интересный вопрос, как проверять есть ли соединение с сервером, для торговли? Обычное соединение явно было, ведь тики приходили, и на каждый тик отправлялся запрос, на открытие ордера. Но в журнале мы видим вот такую картинку...
Объясните пожалуйста, что тут произошло, и почему? Или это магическим образом пропала связь именно в эту минуту?

1.png

#593

Вопрос уважаемым программистам. Как заставить советник торговать на offline М2 графике ренко (график генерируется индикатором RenkoLiveChart v2.1) ?

#594

кинуть советник на график ренко - как вариант

#595


кинуть советник на график ренко - как вариант


Так он и так там весит. Проблема в том, что не все советники торгуют на Renko. Как мне кажется, когда торгуешь на Renko в самом советнике должно что-то прописываться. Либо тот скрипт, индикатор или эксперт, которые формирует Renko график должны быть связаны каким-то образом в самом советнике с фукнциям покупки и продажи и т.д..... в общем, не знаю..
#596



кинуть советник на график ренко - как вариант


Так он и так там весит. Проблема в том, что не все советники торгуют на Renko. Как мне кажется, когда торгуешь на Renko в самом советнике должно что-то прописываться. Либо тот скрипт, индикатор или эксперт, которые формирует Renko график должны быть связаны каким-то образом в самом советнике с фукнциям покупки и продажи и т.д..... в общем, не знаю..

Да ты прав с этим индикатором который прилагается к стратегии не получитться у меня получилось с другой совой генерирующей ренко графики. попробуй эту сову

RenkoLiveChart_v3.2.mq413 скач.

#597

xbms,Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?
Набрал вот такой код,но что то он не работает:
void CLOSEORDER(int ord)
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}

#598


Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?


//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Закрытие позиций по рыночной цене |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn }
}
}
}
}

void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int err, it;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
} else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
#599

mzk_3om6u.Приветствую подскажи пожалуйста что это за переменная- NumberOfTry?

Автор#600


xbms,Здравствуйте! Подскажите пожалуйста как закрыть большую пачку ордеров?
Набрал вот такой код,но что то он не работает:
void CLOSEORDER(int ord)
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}



если нужно закрыть все открытые ордера, то тут можно просто поправить так:

void CLOSEORDER()
{
for (int i=0; i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
if (OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
}
}


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025