[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 391
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Хотя сейчас внимательней код глянул, тут без поллитра не разберешься, сейчас аську свою кину, попробую объяснить что там наваял.PM? OK, in attesa)
Всем привет еще раз и опять вопрос, на который я не могу ответить сам.
Пишу эксперта для тренировки выставления ордеров при появлении условия. Задача простая: чтобы торговал только одной позицией. Чтобы, если цена выше МА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 .....
Вот тут 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... ?
Вот здесь 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...
Там все закрытия по тралу происходят. А я, как я понял, никак не догоню, как именно ордера закрывать. В моем коде в 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, ...."?
Всем привет!
Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."
Всем привет!
Подскажите, как будет выглядеть условие "Если ордер был открыт сегодня, то ...."
se(OrderOpenTime()>iTime(NULL,PERIOD_D1,0)), allora...