Ajuda na codificação... Como obter um indicador para filtrar em vez de alertar? - página 7

 
Maji:
Desculpe, não tenho tempo para examinar todo o código, mas vamos examinar apenas este trecho.

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

Digamos que o OrderOpenPrice = 1,2100

e o lucro é de 0,0010

Portanto, você quer fechar o negócio curto se a oferta for menor ou igual a 1,2100-0,0010 = 1,2090.

Vamos supor que houve uma lacuna e que os preços saltaram 1.2090 e o preço de oferta agora é 1.2088. De acordo com sua fórmula,

Licitação + Lucro = 1.2088 + 0.0010 = 1.2098. NÃO é maior que OrderOpenPrice mesmo que seu sistema tenha excedido o limite de lucro. Portanto, a ordem não será fechada. A lógica da condição de fechamento precisa ser reelaborada e rescriptada, em minha opinião. Além disso, você deve lidar com preços Ask ao lidar com negócios curtos, pois você só pode fechar o negócio ao preço pedido.

Outro conselho,

O ciclo de contagem de for (int cnt = 0; cnt = 0; cnt--) ou algo semelhante.

Boa sorte.

Eu aprecio aprender isto, obrigado Maji! De qualquer forma, esta não é a lógica de fechamento que eu queria sobre isto... a lógica que eu queria era tê-la fechada SE não tivesse desencadeado a perda do trailing stop. Como eu não entendo exatamente como detectar se isso é acionado ou não, não posso usar este tempo para fechar a estratégia de fechamento até aprender como programá-la para fazer o que eu pretendia.

 

Novos critérios de fechamento...ajude-me a colocar o código corretamente, por favor...

Estou precisando de alguma ajuda para colocar outro critério de fechamento, que é que o EMA longo fique abaixo da menor tendência (se longo) e o visto vice-versa, se curto. Não sei exatamente como isolar as posições abertas longas e curtas para fechá-las com este novo critério.

#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 Preciso entender esta parte do código agora....

a primeira linha conta

a segunda linha seleciona os pedidos contados

terceira linha...isto me engana...PENSO que quer saber se a ordem selecionada é uma venda...mas o que há com o "0? Quero dizer que aqui há CINCO linhas de "se"...

Acho que se alguma delas for verdadeira, então ela modificará o pedido de outra forma...acho que ela vai para o "outro" e...bem, isto de alguma forma deve conseguir lidar com posições longas e curtas, mas ainda não entendi.

Já que quero acrescentar critérios para fechar a posição longa ou curta com base na cruz do EMA longo com o EMA menor... não tenho certeza de onde em tudo isso fazer.

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, entendo que todos os if e elses levam a estas linhas. estas são as que eu preciso entender...

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

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

Preciso saber mais sobre como estas linhas de ordem modificam a construção... são estas as que estão fechando assim como as que estão mudando as ordens... ou elas apenas mudam as ordens e algo mais fecha as ordens...

 

Veja a ajuda no 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) ...

Apenas menos digitação

 

Aqui vai você

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);

}

}

}

Chame-o : CloseOrder(OP_BUY); // Feche todas as ordens de compra

ou

CloseOrder(OP_SELL); // Fechar todas as ordens de venda

A razão pela qual estou mantendo todos os pedidos em um array e depois excluo é porque quando fecho o pedido na posição nº 1, então o próximo se torna 1 novamente e temos um problema.

 

Eu esqueço esta

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

 

Ainda estou confuso...

Entenda que eu não criei este código originalmente. Estou trabalhando para entender o que outra pessoa fez e modificá-lo. Só coloquei meu nome na linha de propriedade agora que o modifiquei tanto que ele tem pouca semelhança com o original. Modifiquei mais agora do que deixei intocado. Ainda há alguns aspectos que não entendo e, portanto, não fui capaz de modificar.

O que eu estou procurando é o código que fecha os pedidos... parece que tudo isso está apenas modificando para atualizar a parada móvel.

esta é mais de uma maneira de fechar.

neste momento este EA tem a capacidade de fechar com uma parada de perda.

para fechar com uma parada móvel.

para fechar com uma meta de lucro.

ou para fechar com base na passagem de algum tempo definido após a abertura.

o que não tem que eu queira que ela tenha é a capacidade de fechar se a EMA longa voltar para a EMA de menor tendência. ela poderia fazer esta travessia para fechar uma posição curta ou travessia para fechar uma posição longa. Como posso fazer isso? Quero dizer, com todas essas outras opções de fechamento, onde coloco o novo código para superar todas essas outras opções de fechamento?

Na minha expiração, quando não quero usar algum aspecto disso, simplesmente faço com que o critério desse parâmetro seja tão extremo que nunca vai acioná-lo, o que é como desligar esse critério basicamente. Fazer isso permite que o jogo dos outros critérios mostre o que eles retornariam.

 
elihayun:
Esqueci este aqui
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, muito obrigado!

Então isto é basicamente apenas um código de fechamento?

Será que isto fechará tanto as posições longas como as curtas?

Como eu usaria isto para fechar, se o longema cruzasse de volta no menor tendenciômetro? cruzando para cima se tivesse aberto a posição curta e cruzando para baixo se tivesse aberto a posição longa?

p.s. Não voltarei ao computador até o final da tarde de hoje. Então voltarei a verificar.

 

mais uma pergunta...

o que significa "trocar"?

 

Toda vez que você decide abrir uma chamada de posição LONG: CloseOrders(OP_SELL);

e vise versa.

Olhe para seu código onde u está abrindo as ordens.

Você não precisa verificar se há uma ordem para fechar. A rotina fará isso para u

BTW, eu postei um código para converter o tipo de célula 2006.07.02 até a data em excel. Veja o seu post lá