[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 391

 
splxgf >>:


Хотя сейчас внимательней код глянул, тут без поллитра не разберешься, сейчас аську свою кину, попробую объяснить что там наваял.

PM?OK、待機)

 
Jahspear >>:

Всем привет еще раз и опять вопрос, на который я не могу ответить сам.

Пишу эксперта для тренировки выставления ордеров при появлении условия. Задача простая: чтобы торговал только одной позицией. Чтобы, если цена выше МА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 を見てみると...。
 
renoshnik >>:


Вот тут https://docs.mql4.com/ru/trading/OrdersTotal посмотри.....

ええ、ありがとうございます。今、それを試してみました。今はあまりポジションを開いていない。今は1つ開いて閉じない。マジシャンの様子がおかしい...。?

 
こちら https://www.mql5.com/ru/code/9178 コードはなるべくコメントするようにしました...。役に立つかもしれない...。
 
renoshnik >>:
Вот здесь https://www.mql5.com/ru/code/9178 я старался максимально комментировать код.... Может поможет....

トロール漁業はすべて閉鎖されています。私としては、注文の締め方がよくわからないのです。私のコードでは、OrderCloseでエラーが発生します - チケット番号の代わりにマジシャンの番号です。チケット番号の取得方法を考えているのですが・・・。

 
Jahspear >>:

Там все закрытия по тралу происходят. А я, как я понял, никак не догоню, как именно ордера закрывать. В моем коде в 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;
}
}
}

 

みなさん、こんにちは。

今日、注文が開始された場合、・・・」という条件はどのようなものか、教えてください。

 
Noterday >>:

Всем привет!

Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."

if(TimeDay(OrderOpenTime())==TimeDay(Time[0])&&Time[0]-OrderOpenTime()<24*60*60)
{
   //TODO
}
 
Noterday >>:

Всем привет!

Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."

if(OrderOpenTime()>iTime(NULL,PERIOD_D1,0)), then...

 
ありがとうございました :)