Caratteristiche utili da KimIV - pagina 49

 
KimIV писал (а) >>

Esempi di come usare la funzione ExistOrders().

5. Controlla qualsiasi ordine con un tempo di impostazione di 2 ore o più

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

Buona sera, sono un po' confuso da questo commento. Sono seduto qui per capirlo! Non riesco a capire come formulare correttamente la mia condizione - "non prima di 5 min" o "non più tardi di 5 min"! (Mi era chiaro prima di iniziare a pensarci!)

Ho bisogno di cancellare un ordine in sospeso se non è scattato entro un certo tempo. Per esempio, entro 5 minuti dall'impostazione !

L'ho fatto:

if (ExistOrders(NULL, OP_BUYSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders(NULL, OP_BUYSTOP, Magic);
if (ExistOrders(NULL, OP_SELLSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders(NULL, OP_SELLSTOP, Magic);

È corretto? Ma non funziona nel tester. Gli ordini vengono piazzati e immediatamente cancellati.

Per favore consigliate come scrivere correttamente la funzione ExistOrders()?

 
rid писал (а) >>
Sono un po' confuso...

Sembra che anch'io sia confuso. Sbrodoliamoci insieme... :-)

Il parametro ot (tempo di immissione dell'ordine) è stato introdotto nella funzione ExistOrders per gestire correttamente gli errori 128, 142 e 143. Lo scopo della gestione degli errori è quello di escludere le impostazioni doppie (in casi pratici, anche triple) dello stesso ordine. Per fare questo, il tempo di invio dell'ordine viene memorizzato e i tentativi di trading vengono messi in pausa. Dopo la pausa, viene controllata la presenza dell'ordine con il tempo impostato dopo quello memorizzato. Se c'è un ordine, si conclude che l'obiettivo è stato raggiunto (l'ordine è stato impostato) e i tentativi di trading sono terminati. In altre parole, il tempo dopo il quale viene controllata l'impostazione dell'ordine viene passato al parametro ot. Dopo = non prima.

rid ha scritto (a) >>.
Ho bisogno di cancellare un ordine in sospeso se non è scattato entro un certo tempo. Per esempio, entro 5 minuti dall'impostazione !

Il parametro ot della funzione ExistOrders non è utile in questo caso. Funziona nella direzione opposta. Funziona in direzione di una maggiore vicinanza al presente. Quello che dovete fare è lavorare all'indietro. Il parametro expiration della funzione OrderSend (o il parametro ex della funzione SetOrder) è ottimo per questo.

 

La funzione ClosePosBySelect() per il tester.

Esegue la chiusura di una posizione preselezionata. Questa è una versione leggera della funzione con lo stesso nome, precedentemente pubblicata a pagina 13. Niente di più. Nessuna caratteristica extra. Nella mia pratica, non ho mai avuto una posizione che non fosse chiusa nel tester. Ecco perché non ci sono controlli in questa funzione. Non sono necessari nel tester.

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}

SZY. Esempio di utilizzo della funzione ClosePosBySelect() che darò più tardi, insieme alla funzione OpenPosition() per tester.

 

Ciao a tutti. Per evitare di dover scavare ogni volta nelle pagine, ho dovuto fare il contenuto ramo per ramo.

Ho consolidato le funzioni di temi simili qua e là. Contenuto da 1 a 40 pagine.

Chi vuole può continuare e aggiungere altre pagine e metterle qui.

File:
 

Ciao Igor, ho bisogno del tuo aiuto. Ho deciso di implementare la funzione di chiusura in e-CloseByProfit EA simile a e-CloseByPercentProfit.

Tutto funziona bene, l'expert advisor funziona correttamente e il terminale si chiude. Ma quando riapro il terminale, lo chiude subito.

Per favore aiutatemi a cambiare il codice per correggere questo problema.

//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4 |
//| Kim Igor V. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 22.10.2006 L'Expert Advisor chiude tutte le posizioni non appena il
//| livello di profitto.
//| 20.06.2008 Corretto un errore nel calcolo del profitto in punti.
//+----------------------------------------------------------------------------+
#proprietà copyright "Kim Igor V. aka KimIV"
#proprietà link "http://www.kimiv.ru"
#define MAGIC 20061022

//------- Parametri esterni dell'Expert Advisor ------------------------------------------
extern string _P_Expert = "---------- parametri EA";
extern bool CurSymbolOnly = false; // Solo il simbolo corrente
extern intProfit = 100; // TakeProfit
extern bool CloseTerminal = False; // Chiudi il terminale
extern bool ShowComment = True; // Mostra il commento
extern int NumberAccount = 0; // Numero del conto commerciale
extern bool UseSound = True; // Usa il segnale sonoro
extern string NameFileSound = "manycoin.wav"; // Nome del file audio
extern int Slippage = 3; // slittamento del prezzo
extern inttern NumberOfTry = 5; // Numero di tentativi

//------- Variabili globali dell'Expert Advisor --------------------------------------
colore clCloseBuy = Blu; // colore clCloseSell = Rosso; // colore del simbolo di chiusura dell'acquisto
colore clCloseSell = Rosso; // colore della bandiera di chiusura della vendita
int CurProfit;

//------- Collegamento di moduli esterni -------------------------------------------
#include <stdlib.mqh>.
#include <WinUser32.mqh>

//+----------------------------------------------------------------------------+
//| funzione di inizializzazione dell'esperto |
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting()) Comment(""); }

//+----------------------------------------------------------------------------+
//| funzione di deinizializzazione esperto |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment("); }

//+----------------------------------------------------------------------------+
//| funzione di inizio esperto |
//+----------------------------------------------------------------------------+
void start() {
se (!IsTesting()) {
se (NumberAccount>0 && NumberAccount!=AccountNumber()) {
Message("Il trading sul conto è VIETATO" +AccountNumber());
ritorno;
} else Comment(");
}

CloseByProfit();
se (ShowComment) {
Comment(IIFs(CurSymbolOnly, "CurSymbolOnly ","),
"Profitto corrente=",CurProfit," p."
"Close Profit=",TakeProfit," p."
);
}
}


//+----------------------------------------------------------------------------+
//| Autore: Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versione : 19.02.2008 |
//| Descrizione : Chiusura di una posizione preselezionata
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
bool fc;
clClose;
doppio ll, pa, pb, pp;
int err, it;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumeroOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
mentre (!IsTradeAllowed()) Dormire(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
se (OrderType()==OP_BUY) {
pp=pb; clClose=closeBuy;
} else {
pp=pa; clClose=closeSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
se (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
se (err==146) while (IsTradeContextBusy()) Dormire(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Dormire(1000*5);
}
}
} else Print("Operazione commerciale non valida. Chiudi ",GetNameOP(OrderType());
}

//+----------------------------------------------------------------------------+
//| Autore: Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versione : 19.02.2008 |
//| Descrizione : Chiudere le posizioni al prezzo di mercato prima redditizio |
//+----------------------------------------------------------------------------+
//| Parametri: |
//| sy - nome dello strumento (" - qualsiasi simbolo, |
//| NULL - simbolo corrente) |
| //| op - operazione (-1 - qualsiasi posizione) |
//| mn - MagicNumber (-1 - qualsiasi magia) |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();

// Prima chiudere le posizioni redditizie
per (i=k-1; i>=0; i--) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (mn<0 || OrderMagicNumber()==mn) {
se (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// poi tutto il resto
k=OrdiniTotali();
per (i=k-1; i>=0; i--) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}

//+----------------------------------------------------------------------------+
//| Chiudere tutte le posizioni in profitto.
//+----------------------------------------------------------------------------+
void CloseByProfit() {
doppio pa, pb, pp;
int i, k=OrdersTotal(), pr=0;

per (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
pp=MarketInfo(OrderSymbol(), MODE_POINT);
if (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0.0001; altrimenti pp=0.01;
se (OrderType()==OP_BUY) {
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp, 0);
}
se (OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0);
}
}
}
}
CurProfit=pr;
se (CurProfit>=TakeProfit) ClosePosFirstProfit();
if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
//+----------------------------------------------------------------------------+
//| Chiudi il terminale di trading.
//+----------------------------------------------------------------------------+
void CloseTerminal() {
Stampa("CloseTerminal() si è attivato;)
int hwnd=WindowHandle(Symbol(), Period());
int hwnd_parent=0;

mentre(!IsStopped()) {
hwnd=GetParent(hwnd);
se (hwnd==0) break;
hwnd_parent=hwnd;
}
se (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+----------------------------------------------------------------------------+
//| Restituisce la bandiera di esistenza |
//| Parametri: |
//| sy - nome dello strumento (" - qualsiasi simbolo, |
//| NULL - simbolo corrente) |
| //| op - operazione (-1 - qualsiasi posizione) |
//| mn - MagicNumber (-1 - qualsiasi magia) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();

if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
per (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se (OrderSymbol()==sy || sy==") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+
//| Autore: Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versione : 01.09.2005 |
//| Descrizione: restituisce il nome dell'operazione commerciale
//+----------------------------------------------------------------------------+
//| Parametri: ||
//| op - identificatore dell'operazione commerciale |
//+----------------------------------------------------------------------------+
stringa GetNameOP(int op) {
interruttore (op) {
caso OP_BUY : ritorno("Compra");
caso OP_SELL : return("Sell");
caso OP_BUYLIMIT : return("BuyLimit");
caso OP_SELLLIMIT : return("SellLimit");
caso OP_BUYSTOP : return("BuyStop");
caso OP_SELLSTOP : return("SellStop");
default: return("Operazione sconosciuta");
}
}

//+----------------------------------------------------------------------------+
//| Autore: Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versione : 01.02.2008 |
//| Descrizione : Restituisce uno dei due valori a seconda della condizione.
//+----------------------------------------------------------------------------+
stringa IIFs(bool condition, string ifTrue, string ifFalse) {
se (condizione) return(ifTrue); altrimenti return(ifFalse);
}

//+----------------------------------------------------------------------------+
//| Visualizzare un messaggio nel commento e nel diario di bordo
//+----------------------------------------------------------------------------+
void Message(string m) {
Commento(m);
se (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+

 
Vkorch писал (а) >>
Ciao Igor, ho bisogno del tuo aiuto. Ho deciso di scrivere la funzione di chiusura del terminale in e-CloseByProfit EA simile a e-CloseByPercentProfit.

Tutto funziona bene, l'EA funziona, il terminale si chiude. Ma quando riapro il terminale, l'Expert Advisor lo chiude immediatamente.
Aiutate a cambiare un codice così, che per eliminare questa mancanza.

Fate così:

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а) >>

Fate così:

Grazie, Igor. Riparato. Ma durante la compilazione, ho un errore

'(' - definizione di funzione inaspettata C:\Programmi\MetaTrader - Alpari\experts\e-CloseByProfit.mq4 (180, 19)

Cosa devo fare?

 

Igor, potresti fare una libreria di funzioni per lavorare con ordini e posizioni? La libreria è stata sviluppata e testata per più di 2 anni, ho allegato i file, forse qualche idea vi tornerà utile.

Per quanto riguarda

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Forse sarebbe meglio chiamare OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44);

а

double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo(
"USDCAD", MODE_POINT);
and this insert 
  
 
double lot_min =MarketInfo(Symbol(),MODE_MINLOT)
; 
if(Lots<lot_min) return;

calcolare all'interno della funzione, cioè passare il valore sl a e tp, e calcolare e normalizzare tutto correttamente all'interno della funzione.


	          
 

Ciao Igor!

Se ho una posizione di 0,3 lotti aperta, ho bisogno di:

1. Chiudere parte di una posizione di 0,1 lotti.

Modificare (spostare lo stop loss ad un altro livello)

2.1 Più chiudere parte della posizione 0.1 lotto.

Modificare (impostare lo stop loss ad un altro livello).

3. Chiudere la posizione.

Un'altra domanda? Quando la posizione parziale è chiusa.

OrderClose(OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet);

Ottengo l'errore 131 (volume sbagliato). come posso correggerlo?

Rispondere per favore per un principiante. può essere in parole.

.

 
Prival писал (а) >>
Igor, potresti per favore rendere le funzioni funzionanti con ordini e posizioni in una libreria?

No, non è... In linea di principio, è già organizzato come dovrebbe essere... Non lo sto pubblicando perché non tutte le funzioni di questa libreria sono state ancora pubblicate... ce ne sono un paio o tre rimasti che sono apparsi da quando questo thread è stato iniziato.

E penserò al resto...

Motivazione: