Come faccio a far filtrare l'indicatore al posto dell'avviso? - pagina 7

 
Maji:
Mi dispiace, non ho tempo di esaminare l'intero codice, ma esaminiamo solo questo frammento.

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

Diciamo che l'OrderOpenPrice = 1,2100

e il profitto è di 0,0010

Quindi, si vuole chiudere l'operazione allo scoperto se l'offerta è inferiore o uguale a 1,2100-0,0010 = 1,2090.

Supponiamo che ci sia stato un gap down e che i prezzi abbiano saltato 1.2090 e che il prezzo di offerta sia ora 1.2088. Secondo la tua formula,

Bid + Profit = 1.2088 + 0.0010 = 1.2098. NON è maggiore di OrderOpenPrice anche se il tuo sistema ha superato la soglia di profitto. Pertanto, l'ordine non sarà chiuso. La logica della condizione di chiusura deve essere rivista e riscritta, secondo me. Inoltre, dovresti trattare con i prezzi Ask quando hai a che fare con le operazioni short, dato che puoi chiudere l'operazione solo al prezzo ask.

Un altro consiglio,

Il ciclo di conteggio di for (int cnt = 0 ; cnt = 0; cnt--) o qualcosa di simile.

Buona fortuna.

Apprezzo l'apprendimento di questo, grazie Maji! Questa non è la logica di chiusura che volevo su questo comunque... la logica che volevo era di farlo chiudere SE non avesse innescato il trailing stop loss. Siccome non capisco esattamente come rilevare se è scattato o meno, non posso usare questa strategia di chiusura time-to-close finché non imparo a programmarla per fare quello che volevo.

 

Nuovo criterio di chiusura...aiutatemi a mettere il codice giusto per favore...

Ho bisogno di assistenza per inserire un altro criterio di chiusura, ovvero che il longEMA vada sotto il minortrendsetter (se lungo) e viceversa se corto. Non so esattamente come isolare le posizioni aperte lunghe e corte per chiuderle con questo nuovo criterio.

#property copyright "Copyright 2006, Aaragorn"

//+--------- settings may vary use at your own risk-----------------+

//+--------------user inputs--------------------+

extern double Trendsetter = 250;

extern double Minortrendsetter = 150;

extern double LongEMA = 20;

extern double ShortEMA = 5;

extern double TrailingStop = 15;

extern double TrailingStopTrigger = 1;

extern double StopLoss = 186;

extern double TakeProfit = 250;

extern double Lots = 0.1;

extern double EquityStop = 9;

//---- Custom "Channel-1" Indicator and Filter Parameters

extern int Hours=36;

extern color col=SkyBlue;

extern double TF = 60; //--which bar period for the custom indicator to use

extern double upperproximity = 30; //---disallows long orders within this proximity to resistance line

extern double lowerproximity = 30; //---disallows short orders within this proximity to the support line

//+-----------close based on not triggering trailing stop in allotted time----------------+

extern int MonitorInMinutes = 60; // minutes after open to check state of trade

extern int ThresholdMove = 11; // if after that time we don't have +'x' pips we will exit

extern int MinsMultiplier = 600; // multiplies the MonitorInMinutes to make minutes (if 'x'=60) into hours

//+----------------------end of allotted time user inputs-----------------------------+

//+-----------------------------end of user inputs----------------------------------+

//+------------------------------------------------------------------+

//| expert start function

//+------------------------------------------------------------------+

int start(){

CloseOrder();

int cnt, ticket;

if(Bars<100){

Print("bars less than 100");

return(0);

}

//+----------------------Get Moving Average(s) Data----------------------------------------+

double currentlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period longEMA

double currentshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period shortEMA

double trendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period TrendsetterEMA

double minorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period MinortrendsetterEMA

double prevlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period longEMA

double prevshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period shortEMA

double prevtrendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period TrendsetterEMA

double prevminorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period MinortrendsetterEMA

//+----------------------------end of Get Moving Average(s) Data-----------------------------+

//+--------------------channel filter---------------------------+

double resistance = iCustom(NULL,TF,"Channel-1",Hours,col,0,0);

double support = iCustom(NULL,TF,"Channel-1",Hours,col,2,0);

//+------------------- end channel filter------------------------+

//+---------Obnoxious money management code needs revision----------------+

int total=OrdersTotal();

if(total<1){

if(AccountFreeMargin()<(1000*Lots)){

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

//+---------end of Obnoxious money management code-----------------+

//+---------------------------------------Order Entry--------------------------------------------+

//+---------enter long positions----------+

if (prevshortcurrentlong && currentshort>currentlong>Trendsetter && Ask > resistance - upperproximity*Point){ //---conditions to open long positions change as desired

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);

if(ticket>0){

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

//+---------enter short positions----------+

if (prevshort>prevlong && currentshort<currentlong && currentshort<currentlong<Trendsetter && Ask < support + lowerproximity*Point){ //---conditions to open short positions change as desired

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);

if(ticket>0) {

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

}

}

//+---------end of order entry-------------------------+

//+-------------------------Trailing Stop Code------------------------------------+

for(cnt=0;cnt<total;cnt++) {

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {

if(OrderType()==OP_BUY){

if(TrailingStop>0) {

if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {

if(OrderStopLoss()<Bid-Point*TrailingStop) {

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}else{

if(TrailingStop>0) {

if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

//+-------------------------End of Trailing Stop Code----------------------------+

//+---------------------Equity Stop Code---------------------------+

if((AccountEquity()+ EquityStop)<AccountBalance()) {

{

int ttotal = OrdersTotal();

for(int i=ttotal-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type)

{

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );

break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );

}

if(result == false)

{

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

}

}

}

}

//+---------------------End of Equity Stop Code---------------------------+

//|

//+---------------------Close Based on Time-------------------------------+

//+--------------needs revision, not working as desired---------------------+

//+------------I want it to close IF and ONLY IF trailing stop is NOT triggered-------------+

void CloseOrder()

{

double Profit=ThresholdMove*Point;

int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)

{

if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);

}

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

}

}

}

}

//+---------------------------end of close on time code---------------+
 

ok Ho bisogno di capire questa parte del codice ora....

la prima linea conta

la seconda linea seleziona gli ordini contati

la terza linea...questo mi inganna...io PENSO che voglia sapere se l'ordine selezionato è una vendita...ma cosa succede con lo "0? Voglio dire che ci sono CINQUE linee 'se' qui...

Immagino che se una di esse è vera allora modificherà l'ordine altrimenti...immagino che vada al ..'else' e ...beh questo in qualche modo deve riuscire a gestire sia le posizioni lunghe che quelle corte ma non lo capisco ancora.

Siccome voglio aggiungere dei criteri per chiudere long o short in base all'incrocio del longEMA con il minortrendsetterEMA...non sono sicuro di dove farlo in tutto questo.

for(cnt=0;cnt<total;cnt++) {

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {

if(OrderType()==OP_BUY){

if(TrailingStop>0) {

if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {

if(OrderStopLoss()<Bid-Point*TrailingStop) {

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}else{

if(TrailingStop>0) {

if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

Ok, ho capito che tutti gli if e gli els portano alle linee thess. queste sono quelle che devo capire...

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Rosso);

Ho bisogno di saperne di più su come sono costruite queste linee di modifica degli ordini...sono queste che chiudono e cambiano gli ordini? o cambiano solo gli ordini e qualcos'altro chiude gli ordini?

 

Guarda l'aiuto in MetaEditor

OP_BUY 0 Buying position.

OP_SELL 1 Selling position.

OP_BUYLIMIT 2 Buy limit pending position.

OP_SELLLIMIT 3 Sell limit pending position.

OP_BUYSTOP 4 Buy stop pending position.

OP_SELLSTOP 5 Sell stop pending position.

[/PHP]

so, <= OP_SELL is OP_BUY or OP_SELL. Just instead of using

[PHP]if((OrderType()==OP_SELL) || (OrderType()==OP_BUY) ...

Solo meno digitazione

 

Ecco qui

void CloseOrders(int op)

{

int tik[30], t = 0;

for(int i =0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){

if(OrderSymbol()==Symbol() && MagicNum==OrderMagicNumber() && OrderType() == op){

tik[t] = OrderTicket(); t++;

}

}

}

for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

CloseOrder(tik, OrderLots(), prc);

}

}

}

Chiamalo: CloseOrder(OP_BUY); // Chiudi tutti gli ordini di acquisto

o

CloseOrder(OP_SELL); // Chiudi tutti gli ordini di vendita

La ragione per cui sto mantenendo tutti gli ordini biglietti in un array e poi cancellare è perché quando chiudo l'ordine in posizione # 1 allora il prossimo diventa di nuovo 1 e abbiamo un problema.

 

Ho dimenticato questo

void CloseOrder(int ticket,double numLots,double close_price)

{

int CloseCnt, err;

// try to close 3 Times

CloseCnt = 0;

color clr = Violet;

if (OrderType() == OP_SELL)

clr = Orange;

while (CloseCnt < 3)

{

if (OrderClose(ticket,numLots,close_price,Slippage,clr))

{

CloseCnt = 3;

}

else

{

err=GetLastError();

Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));

if (err > 0) CloseCnt++;

}

}

}

[/PHP]

and dont forget to add this line after #property link

[PHP]#property link "http://www.elihayun.com"

#include

 

Sono ancora confuso...

Comprendete che non ho creato questo codice in origine. Sto lavorando per capire quello che qualcun altro ha fatto e modificarlo. Ho messo il mio nome sulla linea di proprietà solo ora che l'ho modificato così tanto che assomiglia poco all'originale. Ora ne ho modificato più di quanto ne abbia lasciato intatto. Ci sono ancora degli aspetti che non capisco e che quindi non sono stato in grado di modificare.

Quello che sto cercando è il codice che chiude gli ordini... sembra che tutto questo sia solo una modifica per aggiornare il trailing stop.

questo è più di un modo per chiudere.

In questo momento questo EA ha la possibilità di chiudere con uno stop loss.

chiudere con un trailing stop.

chiudere con un obiettivo di take profit.

o di chiudere in base al passaggio di un tempo definito dopo l'apertura.

Quello che non ha e che vorrei che avesse è la capacità di chiudere se il longEMA torna indietro sul minortrendsetterEMA. potrebbe fare questo incrocio verso l'alto per chiudere una posizione corta o verso il basso per chiudere una posizione lunga. Come faccio a farglielo fare? Voglio dire, con tutte queste altre opzioni di chiusura, dove devo mettere il nuovo codice per superare tutte queste altre opzioni di chiusura?

Nella mia sperimentazione, quando non voglio usare qualche aspetto di questo, semplicemente rendo il criterio di quel parametro così estremo che non lo farà mai scattare, il che è come disattivare quel criterio. Facendo questo, gli altri criteri possono mostrare ciò che restituirebbero.

 
elihayun:
Ho dimenticato questo
void CloseOrder(int ticket,double numLots,double close_price)

{

int CloseCnt, err;

// try to close 3 Times

CloseCnt = 0;

color clr = Violet;

if (OrderType() == OP_SELL)

clr = Orange;

while (CloseCnt < 3)

{

if (OrderClose(ticket,numLots,close_price,Slippage,clr))

{

CloseCnt = 3;

}

else

{

err=GetLastError();

Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));

if (err > 0) CloseCnt++;

}

}

}

[/PHP]

and dont forget to add this line after #property link

[PHP]#property link "http://www.elihayun.com"

#include

ok grande grazie!

Quindi questo è fondamentalmente solo un codice di chiusura?

Chiuderà sia le posizioni aperte lunghe che quelle corte?

Come potrei usarlo per chiudere se il longema ha incrociato di nuovo il minortrendsetterema? incrociando verso l'alto se aveva aperto short e incrociando verso il basso se aveva aperto long?

p.s. Non tornerò al computer fino al tardo pomeriggio. Controllerò allora.

 

un'altra domanda...

cosa significa 'swap'?

 

Ogni volta che decidete di aprire una posizione LONG chiamate : CloseOrders(OP_SELL);

e viceversa.

Guarda il tuo codice dove apri gli ordini.

Non devi controllare se c'è un ordine da chiudere. La routine lo farà per te

BTW, ho postato un codice per convertire 2006.07.02 kinda cell in data in excel. Guarda il tuo post lì