SGarnov: Ho provato a inserirlo, ma non si compila. L'intero codice, se necessario, metterò uno screenshot della compilazione. Penso che ci possa essere un altro problema, il mio TP è impostato in relazione allo STOP da un coefficiente (variabile esterna), forse può essere cambiato in impostazione manuale e sarà più facile per EA aggiungere?
dall'ambito globale, rimuovere magic=0 per la compilazione.
Rimosso, nessun errore di compilazione, solo 1 avvertimento appare nella terza linea di funzione nella colonna tp=0 con udienza sulla variabile esterna int tp=0. Non capisco bene cosa non piaccia al programmatore. Tutto il codice allegato, se non è difficile da correggere, la verità è da qualche parte vicino.
Rimosso, nessun errore di compilazione, solo 1 avvertimento appare nella terza linea della funzione nella colonna tp=0 con udienza sulla variabile esterna int tp=0. Non capisco bene cosa non piaccia al programmatore. Tutto il codice allegato, se non sei difficile da correggere, la verità è da qualche parte nelle vicinanze.
Si presenta così
//+------------------------------------------------------------------+//| SGarnov.v2.mq4 |//| Copyright 2020, DrMak. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, DrMak."#property link"https://www.mql5.com"#property version"1.00"#property strict//--- input parametersinputint T_Profit = 2; // Коэффициент Take Profitinputint S_Loss = 100; // Уровень Stop Lossinputdouble O_Lots = 0.01; //Лотыinputint Input4;
inputint Input5;
inputint Input6;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
t_profit = S_Loss*T_Profit;
s_loss = MathMax(S_Loss, MarketInfo(Symbol(), MODE_STOPLEVEL));
// Проверяем наличие ордеров BUYif(CountOrders(_Symbol, 0)>0)
{
// Проверяем последний закрытый ордер SELL на наличие убытка в пунктахif(GetPointLastLoss(1)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(1)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
// Проверяем наличие ордеров SELLif(CountOrders(_Symbol, 1)>0)
{
// Проверяем последний закрытый ордер BUY на наличие убытка в пунктахif(GetPointLastLoss(0)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(0)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
}
//+--------------------------------------------------------------------------------------------------------------------+//| Подсчет ордеров по типу |//+--------------------------------------------------------------------------------------------------------------------+//| 0 - ордера типа BUY 1 - ордера типа SELL |//| 2 - ордера типа BUYLIMIT 3 - ордера типа SELLLIMIT |//| 4 - ордера типа BUYSTOP 5 - ордера типа SELLSTOP |//| 6 - ордера типа Balance -1 - Все типы ордеров |//+--------------------------------------------------------------------------------------------------------------------+int CountOrders(string symb="", int or_ty=-1)
{
int cnt=0;
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(or_ty<0 || or_ty==OrderType()) cnt++;
}
}
}
return(cnt);
}
//+----------------------------------------------------------------------------+//| Модификация ордера |//+----------------------------------------------------------------------------+//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//+----------------------------------------------------------------------------+void ModifyOrder(string symb="", double sl=0, double tp=0)
{
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(OrderStopLoss()==0)
{
if(OrderType()==OP_BUY)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
if(OrderType()==OP_SELL)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Возвращает пункты убытка последнего закрытого ордера в пунктах |//| 0 - последний ордер BUY |//| 1 - последний ордер SELL |//+----------------------------------------------------------------------------+double GetPointLastLoss( int or_ty=-1)
{
datetime t=0;
double result=0,p=0;
int i=OrdersHistoryTotal();
for(int pos=0; pos<i; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
{
if((OrderSymbol()==_Symbol))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(t<OrderCloseTime())
{t=OrderCloseTime(); p=OrderProfit(); or_ty=OrderType();
if(or_ty==OP_BUY&&p<0)
{
result=OrderOpenPrice()-OrderClosePrice();
} else {result=0;}
if(or_ty==OP_SELL&&p<0)
{
result=OrderClosePrice()-OrderOpenPrice();
} else {result=0;}
}
}
}
}
}
return(result);
}
//+------------------------------------------------------------------+
Se mi descrivi cosa dovrebbe fare l'EA, cercherò di aiutarti.
Piazzo un ordine pendente di acquisto - l'EA sta lavorando - l'ordine pendente scatta - l'EA "vede" questo e piazza uno stop loss su questo ordine aperto:
stop loss (il parametro esterno è impostato nelle impostazioni);
Take Profit(il parametro esterno è impostato nelle impostazioni con un rapporto di per esempio 1 a 2);
A) Se il prezzo raggiunge Takei - l'Expert Advisor rimuove lo Stop Loss e un ordine Sell in sospeso;
Variante 2.
B) Se lo stop loss è scattato e l'EA è "andato in storia", allora:
Viene aperto un ordine di vendita e l'Expert Advisor riposiziona questo ordine:
stop loss (il parametro esterno è impostato nelle impostazioni)
Take Profit + uno Stop Loss attivato dalla storia;
un ordine di acquisto pendente al livello di stop loss.
Il prezzo raggiunge il take - l'Expert Advisor rimuove lo stop loss e l'ordine pendente di acquisto.
E viceversa, se il lavoro inizia con un ordine di vendita pendente.
E così l'advisor lavora fino a quando non ferma il suo lavoro con il parametro esterno Stop Loss numero (nel mio caso è 2, significa che la variante 2 sarà ripetuta 3 volte e l'advisor smetterà di lavorare in futuro e cancellerà tutti gli ordini pendenti, il primo stop non è preso in considerazione).
Se takei non viene raggiunto e la variante 2 viene ripetuta, allora 2 stop vengono aggiunti a takei e così via, dipende dal parametro esterno impostato"Stop Loss count".
Il codice, che ho messo su funziona come dovrebbe, tranne il problema, che ho descritto (non vede nella storia di 1 stop o 2 stop, che dovrebbe aggiungere alla presa).
Ho messo un ordine di acquisto pendente - l'EA sta lavorando - l'ordine pendente scatta - l'EA "vede" questo e piazza uno stop loss su questo ordine aperto:
stop loss (il parametro esterno è impostato nelle impostazioni);
Take Profit(il parametro esterno è impostato nelle impostazioni con un rapporto di per esempio 1 a 2);
A) Se il prezzo raggiunge Takei - l'Expert Advisor rimuove lo Stop Loss e un ordine Sell in sospeso;
Variante 2.
B) Se lo stop loss è scattato e l'EA è "andato in storia", allora:
Viene aperto un ordine di vendita e l'Expert Advisor riposiziona questo ordine:
stop loss (il parametro esterno è impostato nelle impostazioni)
Take Profit + uno Stop Loss attivato dalla storia;
un ordine di acquisto pendente al livello di stop loss.
Il prezzo raggiunge il take - l'Expert Advisor rimuove lo stop loss e l'ordine di acquisto pendente.
E viceversa, se il lavoro inizia con un ordine di vendita pendente.
E così l'advisor lavora fino a quando non ferma il suo lavoro con il parametro esterno Stop Loss numero (nel mio caso è 2, significa che la variante 2 sarà ripetuta 3 volte e l'advisor smetterà di lavorare in futuro e cancellerà tutti gli ordini pendenti, il primo stop non è preso in considerazione).
Se takei non viene raggiunto e la variante 2 viene ripetuta, allora 2 stop vengono aggiunti a takei e così via, dipende dal parametro esterno impostato"Stop Loss count".
Il codice, che ho messo su funziona come dovrebbe, tranne il problema, che ho descritto (non vede nella storia di 1 stop o 2 stop, che dovrebbe aggiungere alla presa).
Funziona così.
"Numero di stop loss" - in una fila o per il giorno corrente?
"Numero di stop loss" - in una fila o per il giorno corrente?
Il numero di stop di fila su una coppia di valute.
Per analizzare la storia, l'Expert Advisor inizialmente etichetta gli ordini con i loro ID, ma non li trova nella storia, ho pensato che OrderMagikNumber() li cercherà. Forse a causa del fatto che nella storia si ferma da diverse coppie di valute l'EA smette di "vederle"?
mettere di nuovo la fonte? Tutto quello che deve fare è correggere "cercare i trade stop dalla storia e farli aggiungere alla nuova presa piazzata".
Avete un EA che supporta gli ordini inseriti manualmente?
Ho provato a inserirlo, ma non si compila. L'intero codice, se necessario, metterò uno screenshot della compilazione. Penso che ci possa essere un altro problema, il mio TP è impostato in relazione allo STOP da un coefficiente (variabile esterna), forse può essere cambiato in impostazione manuale e sarà più facile per EA aggiungere?
La funzione
dall'ambito globale. magic=0 per la compilazione.
magic=0La funzione
dall'ambito globale, rimuovere magic=0 per la compilazione.
Rimosso, nessun errore di compilazione, solo 1 avvertimento appare nella terza linea di funzione nella colonna tp=0 con udienza sulla variabile esterna int tp=0. Non capisco bene cosa non piaccia al programmatore. Tutto il codice allegato, se non è difficile da correggere, la verità è da qualche parte vicino.
Rimosso, nessun errore di compilazione, solo 1 avvertimento appare nella terza linea della funzione nella colonna tp=0 con udienza sulla variabile esterna int tp=0. Non capisco bene cosa non piaccia al programmatore. Tutto il codice allegato, se non sei difficile da correggere, la verità è da qualche parte nelle vicinanze.
Si presenta così
Non hai affatto bisogno della magia nel tuo caso
E' più o meno così.
Nel vostro caso la magia non è affatto necessaria.Grazie, lo testerò e riferirò. Spero che funzioni come il mio, ma che aggiunga uno stop (se viene attivato) alla nuova ripresa.
A cosa servono i parametri esterni Input4; 5; 6?
Grazie, lo testerò e riferirò. Spero che funzioni come il mio, ma che aggiunga uno stop (se è scattato) a una nuova ripresa.
Qui c'è solo una modifica. Non c'è cancellazione o inversione di ordine.
Se mi descrivi cosa dovrebbe fare l'EA, cercherò di aiutarti.
A cosa servono i parametri esterni Input4; 5; 6?
Se mi descrivi cosa dovrebbe fare l'EA, cercherò di aiutarti.
Piazzo un ordine pendente di acquisto - l'EA sta lavorando - l'ordine pendente scatta - l'EA "vede" questo e piazza uno stop loss su questo ordine aperto:
stop loss (il parametro esterno è impostato nelle impostazioni);
Take Profit(il parametro esterno è impostato nelle impostazioni con un rapporto di per esempio 1 a 2);
ordine di vendita in sospeso a livello di stop loss.
Possibili scenari.
Variante 1.
A) Se il prezzo raggiunge Takei - l'Expert Advisor rimuove lo Stop Loss e un ordine Sell in sospeso;
Variante 2.
B) Se lo stop loss è scattato e l'EA è "andato in storia", allora:
Viene aperto un ordine di vendita e l'Expert Advisor riposiziona questo ordine:
stop loss (il parametro esterno è impostato nelle impostazioni)
Take Profit + uno Stop Loss attivato dalla storia;
un ordine di acquisto pendente al livello di stop loss.
Il prezzo raggiunge il take - l'Expert Advisor rimuove lo stop loss e l'ordine pendente di acquisto.
E viceversa, se il lavoro inizia con un ordine di vendita pendente.
E così l'advisor lavora fino a quando non ferma il suo lavoro con il parametro esterno Stop Loss numero (nel mio caso è 2, significa che la variante 2 sarà ripetuta 3 volte e l'advisor smetterà di lavorare in futuro e cancellerà tutti gli ordini pendenti, il primo stop non è preso in considerazione).
Se takei non viene raggiunto e la variante 2 viene ripetuta, allora 2 stop vengono aggiunti a takei e così via, dipende dal parametro esterno impostato"Stop Loss count".
Il codice, che ho messo su funziona come dovrebbe, tranne il problema, che ho descritto (non vede nella storia di 1 stop o 2 stop, che dovrebbe aggiungere alla presa).
Come questo.
Ho messo un ordine di acquisto pendente - l'EA sta lavorando - l'ordine pendente scatta - l'EA "vede" questo e piazza uno stop loss su questo ordine aperto:
stop loss (il parametro esterno è impostato nelle impostazioni);
Take Profit(il parametro esterno è impostato nelle impostazioni con un rapporto di per esempio 1 a 2);
ordine di vendita in sospeso a livello di stop loss.
Possibili scenari.
Variante 1.
A) Se il prezzo raggiunge Takei - l'Expert Advisor rimuove lo Stop Loss e un ordine Sell in sospeso;
Variante 2.
B) Se lo stop loss è scattato e l'EA è "andato in storia", allora:
Viene aperto un ordine di vendita e l'Expert Advisor riposiziona questo ordine:
stop loss (il parametro esterno è impostato nelle impostazioni)
Take Profit + uno Stop Loss attivato dalla storia;
un ordine di acquisto pendente al livello di stop loss.
Il prezzo raggiunge il take - l'Expert Advisor rimuove lo stop loss e l'ordine di acquisto pendente.
E viceversa, se il lavoro inizia con un ordine di vendita pendente.
E così l'advisor lavora fino a quando non ferma il suo lavoro con il parametro esterno Stop Loss numero (nel mio caso è 2, significa che la variante 2 sarà ripetuta 3 volte e l'advisor smetterà di lavorare in futuro e cancellerà tutti gli ordini pendenti, il primo stop non è preso in considerazione).
Se takei non viene raggiunto e la variante 2 viene ripetuta, allora 2 stop vengono aggiunti a takei e così via, dipende dal parametro esterno impostato"Stop Loss count".
Il codice, che ho messo su funziona come dovrebbe, tranne il problema, che ho descritto (non vede nella storia di 1 stop o 2 stop, che dovrebbe aggiungere alla presa).
Funziona così.
"Numero di stop loss" - in una fila o per il giorno corrente?
"Numero di stop loss" - in una fila o per il giorno corrente?
Il numero di stop di fila su una coppia di valute.
Per analizzare la storia, l'Expert Advisor inizialmente etichetta gli ordini con i loro ID, ma non li trova nella storia, ho pensato che OrderMagikNumber() li cercherà. Forse a causa del fatto che nella storia si ferma da diverse coppie di valute l'EA smette di "vederle"?
mettere di nuovo la fonte? Tutto quello che deve fare è correggere "cercare i trade stop dalla storia e farli aggiungere alla nuova presa piazzata".