[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 391

 
splxgf >>:


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

PM? OK, ich warte)

 
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;
}


И вот он, зараза, несмотря на то, что должен торговать только одной позицией (есть - ищем условия на продажу, нет - ищем условия на покупку), открывает большое количество позиций, и потом их не закрывает. Я уже голову поломал. Подскажите, что не так?



Hier https://docs.mql4.com/ru/trading/OrdersTotal siehe.....
 
renoshnik >>:


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

Ja, danke. Das habe ich jetzt ausprobiert. Jetzt gibt es nicht mehr viele Stellen zu besetzen. Jetzt öffnet sie eine und lässt sich nicht mehr schließen. Irgendetwas stimmt nicht mit dem Magier... ?

 
Hier https://www.mql5.com/ru/code/9178 habe ich versucht, so viel wie möglich über den Code zu schreiben.... Könnte helfen....
 
renoshnik >>:
Вот здесь https://www.mql5.com/ru/code/9178 я старался максимально комментировать код.... Может поможет....

Alle dortigen Sperrungen betreffen das Schleppnetz. Was mich betrifft, so verstehe ich nicht, wie man Aufträge abschließt. In meinem Code gibt es einen Fehler in OrderClose - Nummer des Zauberers anstelle der Ticketnummer. Ich versuche herauszufinden, wie ich die Ticketnummer bekomme...

 
Jahspear >>:

Там все закрытия по тралу происходят. А я, как я понял, никак не догоню, как именно ордера закрывать. В моем коде в OrderClose ошибка - номер магика вместо номера тикета. Щас пытаюсь понять, как туда номер тикета получить...

Das war's, die Sache ist erledigt. Ich danke Ihnen allen, hier ist die richtige Lösung:


// Мувинг и цена
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;
}
}
}

 

Hallo zusammen!

Können Sie mir sagen, wie die Bedingung "Wenn der Auftrag heute eröffnet wurde, ...." aussehen würde?

 
Noterday >>:

Всем привет!

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

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

Всем привет!

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

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

 
Vielen Dank :)
Grund der Beschwerde: