Всем привет еще раз и опять вопрос, на который я не могу ответить сам.
Пишу эксперта для тренировки выставления ордеров при появлении условия. Задача простая: чтобы торговал только одной позицией. Чтобы, если цена выше МА10 - покупал, если ниже - продавал. Причем еще и тестирую возможность использования магиков ордеров - чтобы эксперт закрывал именно те ордера, что сам ставил. А также, существует, скажем, второй вариант условий на покупку-продажу (пока не добавлял). И чтобы он сам определял, к какому условию относится ордер - магик задается в той функции, которая вызывает открытие позиции. Так же, по условиям, в самом начале он должен определять,есть или нет позиция и идти либо в поиск условий на покупку, либо в поиск условий на продажу.
Вот код:
// Мувинг и цена double MA10; double Price; // Есть или нет позиция и ее номер int Pos; int Magic; double Lot=0.1; double SL; double TP; int Slippage=3;
//-------------------------------------------------------------------- // Поиск условий для покупки и продажи //--------------------------------------------------------------------
И вот он, зараза, несмотря на то, что должен торговать только одной позицией (есть - ищем условия на продажу, нет - ищем условия на покупку), открывает большое количество позиций, и потом их не закрывает. Я уже голову поломал. Подскажите, что не так?
Там все закрытия по тралу происходят. А я, как я понял, никак не догоню, как именно ордера закрывать. В моем коде в OrderClose ошибка - номер магика вместо номера тикета. Щас пытаюсь понять, как туда номер тикета получить...
以上、整理しました。皆さんありがとうございます!正解はこちらです。
// Мувинг и цена double MA10; double Price; // Есть или нет позиция и ее номер int Total=0; int Magic=0; double Lot=0.1; double SL; double TP; int Slippage=3;
//-------------------------------------------------------------------- // Поиск условий для покупки и продажи //--------------------------------------------------------------------
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;
Хотя сейчас внимательней код глянул, тут без поллитра не разберешься, сейчас аську свою кину, попробую объяснить что там наваял.PM?OK、待機)
Всем привет еще раз и опять вопрос, на который я не могу ответить сам.
Пишу эксперта для тренировки выставления ордеров при появлении условия. Задача простая: чтобы торговал только одной позицией. Чтобы, если цена выше МА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;
}
И вот он, зараза, несмотря на то, что должен торговать только одной позицией (есть - ищем условия на продажу, нет - ищем условия на покупку), открывает большое количество позиций, и потом их не закрывает. Я уже голову поломал. Подскажите, что не так?
ここで https://docs.mql4.com/ru/trading/OrdersTotal を見てみると...。
Вот тут https://docs.mql4.com/ru/trading/OrdersTotal посмотри.....ええ、ありがとうございます。今、それを試してみました。今はあまりポジションを開いていない。今は1つ開いて閉じない。マジシャンの様子がおかしい...。?
Вот здесь https://www.mql5.com/ru/code/9178 я старался максимально комментировать код.... Может поможет....
トロール漁業はすべて閉鎖されています。私としては、注文の締め方がよくわからないのです。私のコードでは、OrderCloseでエラーが発生します - チケット番号の代わりにマジシャンの番号です。チケット番号の取得方法を考えているのですが・・・。
Там все закрытия по тралу происходят. А я, как я понял, никак не догоню, как именно ордера закрывать. В моем коде в OrderClose ошибка - номер магика вместо номера тикета. Щас пытаюсь понять, как туда номер тикета получить...
以上、整理しました。皆さんありがとうございます!正解はこちらです。
// Мувинг и цена
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;
}
}
}
みなさん、こんにちは。
今日、注文が開始された場合、・・・」という条件はどのようなものか、教えてください。
Всем привет!
Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."
Всем привет!
Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."
if(OrderOpenTime()>iTime(NULL,PERIOD_D1,0)), then...