Appearance
question:questa parte cosa fa? if(count_184==0 && Li_180!=0 && Ld_164<=Gd_232 && f0_4()) { Ld_196=AccountBalance()*AccountLeverage()*Gd_224; if(!UseMM) Ld_196=LotsSize; Ld_204 = NormalizeDouble(Ld_196 / MarketInfo(Symbol(), MODE_LOTSIZE), Gi_204); Ld_204 = MathMax(Gd_208, Ld_204); Ld_204 = MathMin(Gd_216, Ld_204); if(Li_180<0) { price_24 = NormalizeDouble(Ask + Gd_240, G_digits_192); price_60 = NormalizeDouble(price_24 - (StopLoss+MarketInfo(Symbol(),MODE_SPREAD)) * Point, G_digits_192); if(MarketInfo(Symbol(),MODE_SPREAD)<def_MaxSpread) ticket_20=OrderSend(Symbol(),OP_BUYSTOP,Ld_204,price_24,G_slippage_264,price_60,0,Comment_,MyMagicNumber,0,Lime); if(ticket_20<=0) { error_8=GetLastError(); Print("BUYSTOP2 Send Error Code: "+error_8+" Message: "+Ls_12+" LT: "+DoubleToStr(Ld_204,Gi_204)+" OP: "+DoubleToStr(price_24,G_digits_192)+" SL: "+ DoubleToStr(price_60,G_digits_192)+" Bid: "+DoubleToStr(Bid,G_digits_192)+" Ask: "+DoubleToStr(Ask,G_digits_192)); } } else { price_24 = NormalizeDouble(Bid - Gd_240, G_digits_192); price_60 = NormalizeDouble(price_24+(StopLoss+MarketInfo(Symbol(),MODE_SPREAD)) * Point,G_digits_192); if(MarketInfo(Symbol(),MODE_SPREAD)<def_MaxSpread) ticket_20=OrderSend(Symbol(),OP_SELLSTOP,Ld_204,price_24,G_slippage_264,price_60,0,Comment_,MyMagicNumber,0,Orange); if(ticket_20<=0) { error_8=GetLastError(); Print("SELLSTOP2 Send Error Code: "+error_8+" Message: "+Ls_12+" LT: "+DoubleToStr(Ld_204,Gi_204)+" OP: "+DoubleToStr(price_24,G_digits_192)+" SL: "+ DoubleToStr(price_60,G_digits_192)+" Bid: "+DoubleToStr(Bid,G_digits_192)+" Ask: "+DoubleToStr(Ask,G_digits_192)); } } }
answer:Questa parte del codice esegue una serie di operazioni nell'ambito della logica di trading dell'Expert Advisor (EA) che determinano la creazione di ordini pendenti BUYSTOP o SELLSTOP basati sulle condizioni di mercato. Scomponiamo il processo passo per passo: 1. **Controllo Condizioni Preliminari**: Verifica la presenza di una serie di condizioni prima di procedere con il piazzamento degli ordini: - `count_184==0`: Assicura che non ci siano altri ordini aperti con lo stesso magic number. - `Li_180!=0`: Controlla se precedenti condizioni di trading (presumibilmente rilevate da indicatori o logiche di mercato) indicano un potenziale segnale di trading. Un valore negativo suggerisce un segnale di vendita (SELL) mentre un valore positivo suggerisce un segnale di acquisto (BUY). - `Ld_164<=Gd_232`: Verifica che la media degli spread e delle commissioni (o un altro calcolo legato alla fattibilità dell'ordine) non sia troppo elevata per procedere. - `f0_4()`: Chiama una funzione (probabilmente un filtro basato su timeframe) per controllare se l'EA è all'interno dell'orario programmato per il trading. 2. **Calcolo della Dimensione del Lotto (Lot Size)**: - Se `UseMM` è `TRUE`, la dimensione del lotto viene calcolata in base al saldo del conto, alla leva finanziaria e ad un fattore di rischio (`Gd_224`). - Se `UseMM` è `FALSE`, la dimensione del lotto impostata staticamente (`LotsSize`) viene utilizzata. - Si assicura che la dimensione del lotto sia entro i limiti minimi e massimi consentiti dalla piattaforma (`Gd_208` per il minimo e `Gd_216` per il massimo) attraverso le chiamate a `MathMax` e `MathMin`. 3. **Preparazione dell'Ordine**: - In base al segnale (`Li_180`), prepara il prezzo e lo stop loss per l'ordine pendente. - Per BUYSTOP (`Li_180 < 0`), calcola: - `price_24`: Prezzo al quale si vuole che l'ordine BUYSTOP venga eseguito, situato al di sopra del prezzo `Ask` corrente. - `price_60`: Lo stop loss per questo ordine, situato sotto il prezzo `Ask` corrente allontanandosi in base al valore di `StopLoss` più lo spread di mercato. - Per SELLSTOP (`Li_180 > 0`), calcola: - `price_24`: Prezzo al quale si vuole che l'ordine SELLSTOP venga eseguito, situato al di sotto del prezzo `Bid` corrente. - `price_60`: Lo stop loss per questo ordine, situato sopra il prezzo `Bid` corrente aumentandolo in base al valore di `StopLoss` più lo spread di mercato. 4. **Piazzamento dell'Ordine**: - Controlla se lo spread corrente è minore del massimo spread ammissibile (`def_MaxSpread`). - Se la sopracitata condizione è soddisfatta, chiama `OrderSend()` per piazzare il BUYSTOP o SELLSTOP con i parametri calcolati, inclusi la dimensione del lotto (`Ld_204`), il prezzo di attivazione (`price_24`), lo stop loss (`price_60`) e il magic number (`MyMagicNumber`). 5. **Gestione degli Errori**: - Dopo aver tentato di inviare l'ordine, controlla se `ticket_20` è minore o uguale a zero, che indica che l'ordine non è stato creato con successo. - Utilizza `GetLastError()` per ottenere il codice di errore e stampa un messaggio di errore nel registro della piattaforma di trading per assistere nella diagnosi del problema. La logica qui sopra rispecchia una tipica implementazione di Money Management (MM) e di controlli del contesto di trading prima del piazzamento di un ordine, enfatizzando l'importanza di entrare nel mercato solo sotto condizioni favorevoli e di gestire il rischio adeguatamente.
question:ottengo sempre questo errore: 2024.03.12 20:09:34.796 2023.02.01 20:41:50 Price Action Scalping EURUSD,M1: SELLSTOP2 Send Error Code: 130 Message: LT: 2.00 OP: 1.09567 SL: 1.09599 Bid: 1.09587 Ask: 1.09589 da cosa è dovuto?
answer:L'errore con il codice `130` in MetaTrader è un errore di "invalid stops" che indica che ci sono problemi con i livelli di Stop Loss (SL) o Take Profit (TP) che si sta cercando di impostare per un ordine. In MetaTrader 4 (MT4), questo errore può accadere per diverse ragioni: 1. **Prossimità ai Prezzi Correnti**: I livelli di SL e TP devono essere impostati a una distanza minima dal prezzo corrente di mercato, definita dai requisiti del broker. Se il tuo SL o TP è troppo vicino al prezzo di mercato attuale (Ask per gli ordini BUY e Bid per gli ordini SELL), potresti ricevere questo errore. 2. **Politica del Broker**: Alcuni broker hanno regole specifiche su dove possono essere impostati gli SL e TP. Questo può includere restrizioni sulla distanza minima dagli attuali prezzi di mercato, nota come "stop level". 3. **Impostazioni di Normalizzazione Errate**: Se si sta normalizzando i livelli SL e TP (arrotondandoli al numero corretto di cifre decimali), un errore nella normalizzazione potrebbe portare a una configurazione errata degli stessi. 4. **Arrotondamento**: Bisogna fare attenzione all'arrotondamento dei livelli SL e TP. Per esempio, se la coppia di valute viene scambiata con cinque decimali (pipette), ma comunque imposti gli SL e TP con solo quattro decimali dopo il punto, potresti ricevere un errore. Per risolvere questo errore, controlla i seguenti aspetti: - Assicurati che i livelli di SL e TP stiano rispettando la "distanza di stop" minima richiesta dal tuo broker. Questa informazione è di solito disponibile nelle specifiche del contratto o nella sezione di aiuto del sito web del tuo broker. - Verifica se stai normalizzando correttamente i valori di SL e TP con la funzione `NormalizeDouble()` e che stiano usando il numero corretto di decimali. - Controlla che gli SL e TP non siano impostati all'interno del "prezzo di freeze", che è una zona vicina al prezzo corrente dove il broker non permette modifiche agli ordini. - Consulta il codice per comprendere come vengono calcolati SL e TP e se ci sono margini di prezzo adatti per l'ordine in questione. In base al messaggio di errore che hai ricevuto, la distanza tra l'ordine SELLSTOP al prezzo di apertura `OP`: 1.09567 e lo Stop Loss `SL`: 1.09599 sembra essere troppo piccola e non rispetta la distanza di stop richiesta dal tuo broker, dato che i prezzi di Bid e Ask sono troppo vicini a questi valori. Per affrontare questo problema, dovrai aumentare la distanza o controllare con il tuo broker qual è la distanza di stop minima ammessa e modificare il tuo EA di conseguenza.
question:dove posso modificarla nel codice?
answer:Per modificare la distanza dello Stop Loss nel codice dell'Expert Advisor (EA), dovrai ricercare dove nel codice lo Stop Loss viene calcolato e quindi passato alla funzione `OrderSend()`. Esaminiamo la parte del codice che genera l'errore e discutiamo come potremmo modificare la distanza dello Stop Loss: ```mql4 price_24 = NormalizeDouble(Bid - Gd_240, G_digits_192); price_60 = NormalizeDouble(price_24 + (StopLoss + MarketInfo(Symbol(), MODE_SPREAD)) * Point, G_digits_192); if (MarketInfo(Symbol(), MODE_SPREAD) < def_MaxSpread) { ticket_20 = OrderSend(Symbol(), OP_SELLSTOP, Ld_204, price_24, G_slippage_264, price_60, 0, Comment_, MyMagicNumber, 0, Orange); // ... } ``` Nell'esempio sopra: - `price_24` è il prezzo a cui vuoi che l'ordine SELLSTOP venga attivato. - `price_60` è il livello di Stop Loss calcolato per l'ordine. - `Gd_240`, `StopLoss`, e `MarketInfo(Symbol(), MODE_SPREAD) * Point` sono i valori che contribuiscono al calcolo di `price_60`. Se stai ottenendo l'errore di codice 130, una strategia potrebbe essere quella di aumentare la distanza dello Stop Loss. Ecco come puoi farlo: 1. Aumenta il valore di `StopLoss`: - `StopLoss` è la variabile-che rappresenta la distanza dello Stop Loss in pips. Aumenta questo valore se è troppo vicino al prezzo corrente per soddisfare i requisiti minimi del broker. 2. Aumenta il valore di `Gd_240` se è coinvolto nel calcolo dello Stop Loss: - `Gd_240` sembra essere un margine aggiunto al prezzo di attivazione dell'ordine pendente (price_24). Modificando `Gd_240`, cambierai la distanza dal prezzo corrente a cui il SELLSTOP viene piazzato, che potrebbe influenzare indirettamente la distanza dello Stop Loss. 3. Controlla e aggiusta la distanza minima di Stop Loss supportata dal tuo broker: - Usa la funzione `MarketInfo(Symbol(), MODE_STOPLEVEL)` per recuperare la distanza minima di Stop Loss supportata dal tuo broker e assicurati di impostare il valore dello Stop Loss almeno a quella distanza dal prezzo di attivazione: ```mql4 double stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point; price_60 = NormalizeDouble(price_24 + (StopLoss + stopLevel), G_digits_192); ``` Fai attenzione a configurare questi valori tenendo in considerazione il livello di precisione (decimale) appropriato per il simbolo che stai negoziando. Dopo aver fatto le modifiche nel codice, testa nuovamente l'EA in un ambiente di trading demo per assicurarti che l'errore 130 sia stato risolto prima di passare a un ambiente di trading con soldi veri.
question:proponi una modifica di gd_240. stop loss a 50pt
answer:Per modificare il valore di `Gd_240` e impostare lo Stop Loss a 50 pips, dobbiamo prima considerare il modo in cui il tuo Expert Advisor assume che siano rappresentati i pips. In MetaTrader 4, alcune coppie di valute (soprattutto quelle che includono il JPY) utilizzano due decimale come pips, mentre la maggioranza delle coppie utilizza quattro decimale. Alcuni broker offrono anche prezzi con una cifra decimale extra (pipette), quindi occorre essere precisi su come i pips vengono rappresentati. Essendo che il problema specificato riguarda EURUSD, che tipicamente ha 5 decimale (4 decimali + 1 pipette) in MT4, un pip è rappresentato dalla quarta cifra decimale. Pertanto, 50 pips sarebbero rappresentati come 0.0050. Se vuoi impostare lo Stop Loss a 50 pips, potresti fare quanto segue nel tuo codice: 1. **Correggi il `Gd_240` per assicurare che i tuoi ordini pendenti siano collocati alla corretta distanza**: ```mql4 extern double Gd_240 = 50; // Distanza in pips dal prezzo corrente per il prezzo di trigger dell'ordine pendente ``` 2. **Aggiusta il calcolo del prezzo di attivazione (`price_24`) e dello Stop Loss (`price_60`)**: ```mql4 // Supponendo che la struttura del punto sia 0.00001 per EURUSD double pointSize = MarketInfo(Symbol(), MODE_POINT); double minStopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) * pointSize; // Calcola il prezzo di attivazione per un ordine SELLSTOP price_24 = NormalizeDouble(Bid - Gd_240 * pointSize, G_digits_192); // Calcola lo Stop Loss a +50 pips dal prezzo di attivazione (deve essere sopra per un'operazione SELL) price_60 = NormalizeDouble(price_24 + (50 * pointSize), G_digits_192); // Verifica che lo Stop Loss sia al di sopra del livello di stop minimo del broker price_60 = MathMax(price_24 + minStopLevel, price_60); ``` 3. **Modifica il tuo ordine pendente `OrderSend` di conseguenza**: ```mql4 // Questa è la verifica dell'SL spostata qui come ulteriore controllo prima di inviare l'ordine. if (price_60 - price_24 < minStopLevel) { // Logica per gestire errori o modificare la distanza dello SL prima di inviare l'ordine Print("Errore: Lo Stop Loss non rispetta il livello di stop minimo del broker."); } else { ticket_20 = OrderSend(Symbol(), OP_SELLSTOP, Ld_204, price_24, G_slippage_264, price_60, 0, Comment_, MyMagicNumber, 0, Orange); if (ticket_20 <= 0) { error_8 = GetLastError(); Print("SELLSTOP2 Send Error Code: " + IntegerToString(error_8) + " Message: SL too close to the current price"); } } ``` Con queste modifiche, il tuo EA cercherà di impostare l'ordine pendente SELLSTOP con un prezzo di attivazione a 50 pips sotto il prezzo corrente e con uno Stop Loss a 50 pips sopra il prezzo di attivazione. Assicurati di testare questi cambiamenti su un conto demo per validare la logica prima di operare in un ambiente live, poiché errori nella gestione degli ordini possono risultare costosi.