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

 
drknn:

Non capisco cosa ho una linea nell'apertura dell'ordine di mercato, la copio e ne aggiungo una nuova all'ordine ma lo stesso errore 4107 non funziona, se vi interessa guardate cosa mi è sfuggito

File:
test_21_1.mq4  15 kb
 
FoxUA:

Non capisco, ho questa linea nell'apertura dell'ordine a mercato, la copio in un ordine pendente e ne aggiungo uno nuovo, ma lo stesso errore 4107 continua a scrivere nel log, ma gli ordini pendenti sono messi fuori, se volete vedere cosa mi è sfuggito.


Avete un codice dannatamente mal organizzato. E i nomi delle variabili hanno abbreviazioni che rendono anche difficile la lettura.

Il codice dovrebbe essere organizzato in blocchi. Assegnate i nomi alle variabili in modo tale che sia chiaro a colpo d'occhio di cosa si tratta nel codice. Nomi costanti (prendi l'abitudine) scrivili in lettere maiuscole. L'inizializzazione delle costanti con valori deve essere inserita in un blocco di inizializzazione. Così, per esempio, avete un uso assolutamente ingiustificato della stringa

stringa sy = Symbol();

all'inizio dell'EA. Bene, ditemi perché ad ogni tick perché avete bisogno di chiamare la funzione Symbol(), se durante tutto lo scambio il nome del simbolo rimane lo stesso? È sufficiente inizializzare una volta con il valore della variabile sy nel blocco di inizializzazione, ed è tutto. Inoltre, questo blocco di codice

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

È fondamentalmente sbagliato! Per scoprire lo stop loss dell'ultimo ordine, esso (l'ordine) deve prima essere selezionato usando OrderSelect() - vedi l'esempio nel contatore di ordini qui sotto. Questo significa che se hai bisogno di livelli di stop per gli ultimi ordini, dovrai farlo tramite un ciclo. Il prossimo. Il design di

int total = OrdersTotal();
if(total == 0){

}

non è giustificato. La funzione OrdersTotal() restituisce il numero totale di ordini già aperti nel terminale. Questo valore include gli ordini aperti da altri strumenti di trading, così come gli ordini che non sono stati aperti dall'Expert Advisor, ma da te personalmente per lo stesso strumento, che l'Expert Advisor ha piazzato.

Se non hai intenzione di fare trading a mano e fai trading solo sul simbolo su cui è stato lanciato l'EA, allora questo design funzionerà. Ma non appena vuoi fare trading con le mani e l'EA non interferisce con i tuoi trade manuali, o vuoi che i trade vengano eseguiti anche con altri simboli, il design ti deluderà davvero. Quindi è meglio scrivere contatori di ordini separati per ogni tipo di ordine. Ecco un esempio di tale contatore.

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){continue;}// если не наш, то смотрим следующий
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  

Riscrivi il codice tenendo conto delle raccomandazioni di cui sopra!!!

 

Scusa, non avevo capito che le stringhe come

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

chiamare un sottoprogramma.

Ma è comunque meglio organizzarlo in modo diverso.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Non è necessario passare un nome simbolico di un simbolo di trading nel sottoprogramma. La tua subroutine è nell'Expert Advisor, non nella libreria inclusa. Poiché la variabile sy è dichiarata al livello globale dell'Expert Advisor, questa variabile è nell'ambito di tali sottoprogrammi. Inoltre, si passa il secondo parametro al sottoprogramma, ma quando si chiama il sottoprogramma stesso, si inizializza questo parametro con un valore (int op=-1) - non è necessario farlo. Lo stesso vale per il prossimo parametro.

La linea

>> if (op<0 || OrderType()==op) {

è di nuovo illeggibile. Guarda com'è organizzato il mio bancone!

 

E poi c'è questo. Il blocco di codice

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

viene chiamato ad ogni tick. Ma non è necessario per ogni zecca. È sufficiente conoscere l'ordine di stop/profitto in alcuni casi. Questi sono i casi in cui dovete chiamare la vostra subroutine.

 
spidey:

Ciao, puoi per favore allegare un avviso all'indicatore (quello verde incrocia quello rosso dall'alto al basso - vendere, indietro - comprare)?

Beh, qualcuno sta postando di nuovo codici rubati sul forum. :))))))))

Dubito che qualcuno voglia scavare in questa accozzaglia di variabili numerate gratuitamente :)

 
spidey:

Buon pomeriggio, potreste aggiungere un avviso alla tacchina (quello verde incrocia quello rosso dall'alto al basso - vendere, indietro - comprare)?

Se lo fai di nuovo sarò costretto a bandirti dal gioco.

Questa è una violazione delle regole del forum.

 
il codice deve essere pubblicato?
 
drknn:

Scusa, non avevo capito che le stringhe come

chiamare un sottoprogramma.

Ma è comunque meglio organizzarlo in modo diverso.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Non è necessario passare un nome simbolico di un simbolo di trading nel sottoprogramma. La tua subroutine è nell'Expert Advisor, non nella libreria inclusa. Poiché la variabile sy è dichiarata al livello globale dell'Expert Advisor, questa variabile è nell'ambito di tali sottoprogrammi. Poi, si passa un secondo parametro al sottoprogramma, ma quando si chiama il sottoprogramma stesso, si inizializza questo parametro con un valore (int op=-1) - non è necessario farlo. Lo stesso vale per il prossimo parametro.

La linea

>> if (op<0 || OrderType()==op) {

è di nuovo illeggibile. Guarda com'è organizzato il mio bancone!

Quindi credo che la chiamata alla funzione possa essere scritta semplicemente

PrAskLim = StopLossLastPos(OP_SELL); nella funzione stessa

doppio StopLossLastPos(int op=-1,) come questo?

Ho già detto che ho preso le funzioni da questo sito, il loro lavoro è stato testato perché non oso cambiare le loro variabili per altre più leggibili, perché potrei mancare di esperienza in ciò che si può e ciò che non si può cambiare; questo è irto del pericolo che io possa cambiare qualcosa di sbagliato in una funzione che funziona e si ago in un mucchio di codice tutto da capo,

ma ho sistemato il più possibile quello che ho aggiunto io stesso,

L'ho già aggiunto io stesso ma non ha risolto i miei problemi con il log 4107 e devo chiedere come posso cambiare prezzo e stop perché non ho cambiato nulla in modo radicale.

La seconda domanda è come aggiungere uno spread a questo prezzo PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

Ecco la versione modificata dell'EA

File:
test_21_2.mq4  16 kb
 
spidey:
il codice deve essere pubblicato?
Non c'è bisogno di postare la roba rubata.
 
drknn:
Non c'è bisogno di postare roba rubata.

Non c'è bisogno di rubare.

E le regole di questa risorsa non lo vietano...

https://www.mql5.com/ru/code/8089

;)