[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 665
Mi dispiace che sia così brutto - ho dovuto scriverlo a memoria perché il codice non funzionava e l'ho cancellato. Ma tu, come professionista, dovresti essere comprensibile (spero).
Mi lusinghi :)) Sono un principiante proprio come te...
extremumprice.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.//--------------------------------------------------------------------externint Quant_Bars =30; // Количество баровbool OpnBuy =false,
OpnSell =false;
//--------------------------------------------------------------------int start() // Спец. функция start
{
int i; // Номер бара double Minimum=Bid, // Минимальная цена
Maximum=Bid; // Максимальная ценаfor(i=0;i<=Quant_Bars-1;i++) // От нуля (!) до..
{ // ..Quant_Bars-1 (!)if (Low[i]< Minimum) // Если < известного
Minimum=Low[i]; // то оно и будет минif (High[i]> Maximum) // Если > известного
Maximum=High[i]; // то оно и будет макс
}
//--------------------------------------------------------------------if (iOpen(NULL,0,1)>Maximum)
{
OpnBuy =true:
OpnSell=false;
}
if (iOpen(NULL,0,1)<Minimum)
{
OpnSell=true;
OpnBuy =false:
}
//-------------------------------------------------------------------// А тут код открытия позиций. if (OpnBuy) {открываем Бай};// if (OpnSell) {открываем Селл};// Но обязательно нужно сделать проверку на существование уже открытой позиции,// иначе они будут открываться на каждом тике пока присутствует сигнал...return; // Выход из start()
}
//--------------------------------------------------------------------
Va più o meno così. Non l'ho controllato, l'ho scritto su due piedi...
1. impostare l'ordine pendente con un numero magico, diciamo 101, e resettare il flag per convertire l'ordine in una posizione, diciamo ConvOrd=false;
2. controllare se la posizione con la magia 101 è apparsa; in caso affermativo, impostare il flag di conversione ConvOrd=true;
3. Controllare ConvOrd per la verità e se ConvOrd==vero, controlliamo se la posizione con il numero magico 101 esiste - e se manca significa che è già chiuso.
{deselezionare ConvOrd=false; impostarne uno nuovo in sospeso;}.
Penso che possiamo fare a meno delle bandiere...
Capisco la logica, ma non so come implementarla nel codice. Ho provato molte varianti ma non ho ottenuto alcun risultato. Penso di essere un idiota. Ecco perché ho scritto qui. A pag. 663 vi ho mostrato il mio codice. Se sei interessato, per favore dimmi come migliorarlo o almeno dimmi come migliorarlo. Grazie.
artmedia70, Roger grazie per il tuo aiuto. Penso di aver capito, infatti il prezzo alla barra 0 non può essere inferiore o superiore al minimo e al massimo, non ci avevo pensato e ho aggiunto Ask come valore della variabile Min, ora sembra funzionare. artmedia70, rispetto a me, la maggior parte sono professionisti))). Grazie ancora.
dimon74: Capisco la logica, ma non so come implementarla nel codice. Ho provato molte varianti ma non ho ottenuto alcun risultato. Penso di essere un idiota. Ecco perché ho scritto qui. A pag. 663 vi ho mostrato il mio codice. Se siete interessati, per favore ditemi come migliorarlo o almeno ditemi come migliorarlo. Grazie.
Prova un modo più semplice, quando metti un ordine SellStop, ricorda il valore TakeProfit e se il Bid scende sotto quel prezzo, mettilo su Buy.
Non capisco perché ci sono due posizioni di chiusura contemporaneamente. La logica va così:
Quando il capitale raggiunge una certa percentuale del profitto precedente, chiudiamo tutte le posizioni... Questo funziona correttamente... Il prossimo...
Se il capitale scende di una certa percentuale dal suo valore precedente, cercate la posizione con la perdita maggiore, identificate chi è... Comprare o vendere.
e aprire una posizione di chiusura nella direzione opposta con doppio lotto. Poi guardiamo il loro profitto totale (della posizione perdente e bloccante) e appena diventa più grande,
Diciamo 10 pip, chiudiamoli...
Logicamente, l'equità dovrebbe essere controllata al prossimo tick e se tutto è OK, si continua a lavorare... Se tutto è di nuovo a posto, dovremo cercare il prossimo babbeo...
Ma per qualche motivo apre due posizioni di chiusura contemporaneamente... e Compra e Vendi, e se il lotto era 0,1, allora la prima chiusura apre il doppio del lotto = 0,2,
e il secondo lo raddoppia di nuovo e si apre con 0,4 lotto ... Rispettivamente, che diavolo di lotto c'è, se stanno combattendo tra di loro per un posto sotto il sole ... :(
Sto allegando il codice, forse qualcuno potrebbe punzecchiarmi con il suo... dito.
//----------------- Закрытие позиций если эквити выросло на N процентов ---------------------------if (Equ_NEW>=Equ_OLD+EquPerc) // Новое эквити больше старого на процент прибыли..
{
// ClosePosBySizeLossInCurrency(NULL, -1, -1, 0); // Закрытие всех убыточных позиций
ClosePosFirstProfit(NULL, -1, -1); // Закрываем все позиции, сначала прибыльные
DeleteOrders(NULL, -1, -1); // Удаляем ордера
Equ_NEW=AccountEquity(); // Запоминаем новое значение эквити
Equ_OLD=Equ_NEW; // и вписываем его в "старое"
CountClsEQU++; // Увеличиваем счётчик кол-ва закрытий для ф-ции вывода информации
LockBuy51 =true; // Разрешаем открытие локирующих
LockSell51=true; // позиций Buy и Sell
OpnBuy51 =true; // и вообще разрешаем открываться
OpnSell51 =true; // в любую сторону...
}
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------if (Equ_NEW<=Equ_OLD-EquPerc/2) // Новое эквити меньше старого на столько-то процентов...
{
Trade=false; // Запрещаем торговлю//-------------- Закрытие двух позиций, если ранее был установлен лок на убыточную ------------- if (OrderSelect(TicketLoss, SELECT_BY_POS, MODE_TRADES)) // Выбираем убыточную позицию (если её тикет
{ // ранее был сохранён в TicketLoss)double prloss=OrderProfit()+OrderSwap(); // Размер профита убыточной позицииint typeloss =OrderType(); // Тип убыточной позицииint mnloss =OrderMagicNumber(); // Magic убыточной позиции
}
if (OrderSelect(TicketLock, SELECT_BY_POS, MODE_TRADES)) // Выбираем локирующую позицию (если её тикет
{ // ранее был сохранён в TicketLock)double prlock=OrderProfit()+OrderSwap(); // Размер профита локирующей позицииint typelock =OrderType(); // Тип локирующей позиции
}
if (prloss+prlock>=10*Point) // Если их суммарный профит больше 10 пунктов
{
ClosePositions(NULL, typelock, 5100); // Закрываем локирующую позицию
ClosePositions(NULL, typeloss, mnloss); // Закрываем убыточную позицию
}
//--------------- Поиск убыточной позиции и установка локирующей ------------------------- double Loss=0; // Последнее значение убыткаint i, k=OrdersTotal(), OrdTicket=-1;
for (i=k-1; i>=0; i--) { // Цикл по всем ордерам терминалаif (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderProfit()+OrderSwap()<0)) { // Если профит позиции меньше 0if (Loss>OrderProfit()+OrderSwap()) { // Если последнее значение убытка больше убытка позиции
Loss=OrderProfit()+OrderSwap(); // Значит тут убыток больше, запоминаем как последнее
OrdTicket=i; // Запоминаем номер убыточной позиции
}
}
}
}
if (OrdTicket>=0) {
if (OrderSelect(OrdTicket, SELECT_BY_POS, MODE_TRADES)) { // Выбираем позицию по тикету
TicketLoss=OrdTicket; // Запоминаем как тикет убыточной позыif (OrderType()==OP_BUY) // Если её тип Бай
{
Magic=5100; // Задаём магик...
New_Comm="Sell_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_SELL, 5100, 0)){ // Если нет локирующего Sell
OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_SELL, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Sell
}
if (OrderType()==OP_SELL)
{
Magic=5100; // Задаём магик...
New_Comm="Buy_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_BUY, 5100, 0)){ // Если нет локирующего Buy
OpenPosition(NULL,OP_BUY,Lots_New,0,pa+tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_BUY, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Buy
}
}
}
}
A partire da
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
Non contare i massimi e i minimi dalla barra zero ma dalla prima barra, sulla barra zero il Bid non può essere inferiore al Min.
doppio
Min=Bid, dichiarazione della variabile
Max=Offerta,
____________________________________________________________________________________________
for (i=0;i<=20-1;i++) criteri di apertura
{se (Low[i]<Min) Min=Low[i]:
se (Alto[i]>Max) Max=Alto[i];
}
se (................. &&Ask>Max)
{
Opn_B=true; //aprire Buy
}
se (................ &&Bid<Min)
{
Opn_S=true; //aprire Vendere
}
___________________________________________________________________________________________
Mi dispiace che sia così brutto - ho dovuto scriverlo a memoria perché il codice non funzionava e l'ho cancellato. Ma tu, come professionista, dovresti essere comprensibile (spero).
____________________________________________________________________________________________
Mi lusinghi :)) Sono un principiante proprio come te...
Va più o meno così. Non l'ho controllato, l'ho scritto su due piedi...Quindi ecco la logica:
1. impostare l'ordine pendente con un numero magico, diciamo 101, e resettare il flag per convertire l'ordine in una posizione, diciamo ConvOrd=false;
2. controllare se la posizione con la magia 101 è apparsa; in caso affermativo, impostare il flag di conversione ConvOrd=true;
3. Controllare ConvOrd per la verità e se ConvOrd==vero,
controlliamo se la posizione con il numero magico 101 esiste - e se manca
significa che è già chiuso.
{deselezionare ConvOrd=false; impostarne uno nuovo in sospeso;}.
Penso che possiamo fare a meno delle bandiere...
Capisco la logica, ma non so come implementarla nel codice. Ho provato molte varianti ma non ho ottenuto alcun risultato. Penso di essere un idiota. Ecco perché ho scritto qui. A pag. 663 vi ho mostrato il mio codice. Se siete interessati, per favore ditemi come migliorarlo o almeno ditemi come migliorarlo. Grazie.
Prova un modo più semplice, quando metti un ordine SellStop, ricorda il valore TakeProfit e se il Bid scende sotto quel prezzo, mettilo su Buy.
Prova un modo più semplice, quando metti un ordine SellStop, ricorda il valore TakeProfit e se il Bid scende sotto questo prezzo, mettilo su Buy.
Grazie per il consiglio, ho già provato questa opzione ma non è adatta alla mia strategia.
Non capisco perché ci sono due posizioni di chiusura contemporaneamente. La logica va così:
Quando il capitale raggiunge una certa percentuale del profitto precedente, chiudiamo tutte le posizioni... Questo funziona correttamente... Il prossimo...
Se il capitale scende di una certa percentuale dal suo valore precedente, cercate la posizione con la perdita maggiore, identificate chi è... Comprare o vendere.
e aprire una posizione di chiusura nella direzione opposta con doppio lotto. Poi guardiamo il loro profitto totale (della posizione perdente e bloccante) e appena diventa più grande,
Diciamo 10 pip, chiudiamoli...
Logicamente, l'equità dovrebbe essere controllata al prossimo tick e se tutto è OK, si continua a lavorare... Se tutto è di nuovo a posto, dovremo cercare il prossimo babbeo...
Ma per qualche motivo apre due posizioni di chiusura contemporaneamente... e Compra e Vendi, e se il lotto era 0,1, allora la prima chiusura apre il doppio del lotto = 0,2,
e il secondo lo raddoppia di nuovo e si apre con 0,4 lotto ... Rispettivamente, che diavolo di lotto c'è, se stanno combattendo tra di loro per un posto sotto il sole ... :(
Sto allegando il codice, forse qualcuno potrebbe punzecchiarmi con il suo... dito.
A partire da
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------...c'è una canna da qualche parte...
PAGINA NUMERO "666" :-)