[WARNING CLOSED!] Any newbie question, so as not to clutter up the forum. Professionals, don't go by. Can't go anywhere without you. - page 391
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
Хотя сейчас внимательней код глянул, тут без поллитра не разберешься, сейчас аську свою кину, попробую объяснить что там наваял.PM? OK, waiting)
Всем привет еще раз и опять вопрос, на который я не могу ответить сам.
Пишу эксперта для тренировки выставления ордеров при появлении условия. Задача простая: чтобы торговал только одной позицией. Чтобы, если цена выше МА10 - покупал, если ниже - продавал. Причем еще и тестирую возможность использования магиков ордеров - чтобы эксперт закрывал именно те ордера, что сам ставил. А также, существует, скажем, второй вариант условий на покупку-продажу (пока не добавлял). И чтобы он сам определял, к какому условию относится ордер - магик задается в той функции, которая вызывает открытие позиции. Так же, по условиям, в самом начале он должен определять,есть или нет позиция и идти либо в поиск условий на покупку, либо в поиск условий на продажу.
Вот код:
// Мувинг и цена
double MA10;
double Price;
// Есть или нет позиция и ее номер
int Pos;
int Magic;
double Lot=0.1;
double SL;
double TP;
int Slippage=3;
//--------------------------------------------------------------------
void start()
{
MA10 = iMA(NULL,0,10,0,0,0,0);
Price = Bid;
CheckPos();
}
//--------------------------------------------------------------------
void CheckPos()
{
if(Pos==0)
CheckBuy();
CheckSell();
}
//--------------------------------------------------------------------
// Поиск условий для покупки и продажи
//--------------------------------------------------------------------
void CheckBuy()
{
if (NormalizeDouble(Price,Digits) > NormalizeDouble(MA10,Digits))
Magic=10;
Buy();
return;
}
//--------------------------------------------------------------------
void CheckSell()
{
if (NormalizeDouble(Price,Digits) < NormalizeDouble(MA10,Digits))
Sell();
return;
}
//--------------------------------------------------------------------
// Выставление ордеров
//--------------------------------------------------------------------
void Buy()
{
string Symb=Symbol();
Pos=1;
OrderSend(Symb, OP_BUY, Lot, Ask, Slippage, SL, TP, NULL, Magic);
return;
}
//--------------------------------------------------------------------
void Sell()
{
Pos=0;
OrderClose(Magic, Lot, Bid, Slippage);
return;
}
И вот он, зараза, несмотря на то, что должен торговать только одной позицией (есть - ищем условия на продажу, нет - ищем условия на покупку), открывает большое количество позиций, и потом их не закрывает. Я уже голову поломал. Подскажите, что не так?
Here https://docs.mql4.com/ru/trading/OrdersTotal look at.....
Вот тут https://docs.mql4.com/ru/trading/OrdersTotal посмотри.....Yeah, thanks. I've tried that now. Now it doesn't open a lot of positions. Now it opens one and won't close. Something wrong with the magician... ?
Вот здесь https://www.mql5.com/ru/code/9178 я старался максимально комментировать код.... Может поможет....
All the closures there are on the trawl. As for me, I don't understand how to close orders. In my code, there is an error in OrderClose - number of magician instead of ticket number. I am trying to figure out how to get the ticket number...
Там все закрытия по тралу происходят. А я, как я понял, никак не догоню, как именно ордера закрывать. В моем коде в OrderClose ошибка - номер магика вместо номера тикета. Щас пытаюсь понять, как туда номер тикета получить...
That's it, it's sorted. Thank you all, here's the right solution:
// Мувинг и цена
double MA10;
double Price;
// Есть или нет позиция и ее номер
int Total=0;
int Magic=0;
double Lot=0.1;
double SL;
double TP;
int Slippage=3;
//--------------------------------------------------------------------
void start()
{
MA10 = iMA(NULL,0,10,0,0,0,0);
Price = Bid;
Total = OrdersTotal();
CheckPos();
}
//--------------------------------------------------------------------
void CheckPos()
{
if(Total==0)
CheckBuy();
if(Total>0)
CheckSell();
}
//--------------------------------------------------------------------
// Поиск условий для покупки и продажи
//--------------------------------------------------------------------
void CheckBuy()
{
if (NormalizeDouble(Price,Digits) > NormalizeDouble(MA10,Digits))
{
Magic=10;
Buy();
}
return;
}
//--------------------------------------------------------------------
void CheckSell()
{
if (NormalizeDouble(Price,Digits) < NormalizeDouble(MA10,Digits))
Sell();
return;
}
//--------------------------------------------------------------------
// Выставление ордеров
//--------------------------------------------------------------------
void Buy()
{
string Symb=Symbol();
if (Total>0) return;
OrderSend(Symb, OP_BUY, Lot, Ask, Slippage, SL, TP, NULL, Magic);
return;
}
//--------------------------------------------------------------------
void Sell()
{
if (Total==0) return;
for(int i = 0; i < OrdersTotal(); i++)
{
// already closed
if(OrderSelect(i, SELECT_BY_POS) == false) continue;
// not current symbol
if(OrderSymbol() != Symbol()) continue;
// order was opened in another way
if(OrderMagicNumber() != Magic) continue;
if(OrderType() == OP_BUY)
{
if(OrderClose(OrderTicket(), OrderLots(), Bid, Slippage))
{
i--;
}
Magic=0;
return;
}
}
}
Hi all!
Can you tell me what the condition "If the order was opened today, ...." would look like?
Всем привет!
Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."
Всем привет!
Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."
if(OrderOpenTime()>iTime(NULL,PERIOD_D1,0)), then...