[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 391

 
splxgf >>:


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

PM? OK, in attesa)

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


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



Qui https://docs.mql4.com/ru/trading/OrdersTotal guardare .....
 
renoshnik >>:


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

Sì, grazie. L'ho provato ora. Ora non apre molte posizioni. Ora ne apre uno e non si chiude. C'è qualcosa che non va con il mago... ?

 
Qui https://www.mql5.com/ru/code/9178 ho cercato di commentare il più possibile il codice .... Potrebbe essere d'aiuto....
 
renoshnik >>:
Вот здесь https://www.mql5.com/ru/code/9178 я старался максимально комментировать код.... Может поможет....

Tutte le chiusure sono sulla pesca a strascico. Per quanto mi riguarda, non capisco come chiudere gli ordini. Nel mio codice, c'è un errore in OrderClose - numero del mago invece del numero del biglietto. Sto cercando di capire come ottenere il numero del biglietto...

 
Jahspear >>:

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

Ecco, è tutto risolto. Grazie a tutti, ecco la soluzione giusta:


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

 

Ciao a tutti!

Potete dirmi come sarebbe la condizione "Se l'ordine è stato aperto oggi, ...."?

 
Noterday >>:

Всем привет!

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

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

Всем привет!

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

se(OrderOpenTime()>iTime(NULL,PERIOD_D1,0)), allora...

 
Grazie :)
Motivazione: