Pergunte! - página 63

 

ok, eu descobri o cálculo do pivô. Obrigado por sua assistência.

O problema que enfrento agora é que quando abre corretamente a ordem pendente nos locais corretos de preço, continua a abrir ordens pendentes repetidas vezes cada vez que a ação de preço se move 1 pip.

Eu olhei e continuarei a pesquisar por que isto está acontecendo, mas queria ver se você poderia me dar uma dica ou ajudar se você vir um erro lógico que estou fazendo.

Como sempre, obrigado por seu tempo.

extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.

extern int look_price_min = 35; // Offset in minutes when to look on price.

extern int close_hour = 12; // Close all orders after this hour

bool use_close_hour = true; // set it to false to ignore close_hour

int take_profit = 20;

extern int Currency_Spread = 4;

int open_long = 21;

int open_short = 21;

int stop_long = 30;

int stop_short = 30;

extern int slippage = 0;// Put what your brooker requires

extern double lots = 0.20; // Position size

extern int magic = 123;

bool clear_to_send = true;

void ReportStrategy()

{

int totalorders = HistoryTotal();

double StrategyProfit = 0.0;

double StrategyProfitOpen = 0.0;

int StrategyOrders = 0;

int StrategyOrdersOpen = 0;

for(int j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrders++;

StrategyProfit += OrderProfit();

}

}

}

totalorders = OrdersTotal();

for(j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrdersOpen++;

StrategyProfitOpen += OrderProfit();

}

}

}

Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",

StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",

"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));

return;

}

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

//| expert initialization function |

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

int init()

{

//----

ReportStrategy();

//----

return(0);

}

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

//| expert deinitialization function |

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

int deinit()

{

//----

//----

return(0);

}

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

//| expert start function |

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

int start()

{

ReportStrategy();

if(Hour() >= close_hour &&

use_close_hour){

// we are after closing time

int totalorders = OrdersTotal();

for(int j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

return(0);

}

if(Hour() == look_price_hour &&

Minute() >= look_price_min &&

clear_to_send){

// Probably I need to close any old positions first:

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

}

double PIVOT;

PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;

// Send orders:

OrderSend(Symbol(),

OP_BUYSTOP,

lots,

PIVOT+(open_long+Currency_Spread)*Point, // Spread included

slippage,

PIVOT+((open_long+Currency_Spread)-stop_long)*Point,

PIVOT+((open_long+Currency_Spread)+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

OrderSend(Symbol(),

OP_SELLSTOP,

lots,

PIVOT-open_short*Point,

slippage,

PIVOT-(open_short-stop_short)*Point,

PIVOT-(open_short+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

clear_to_send = false; // mark that orders are sent

if(!clear_to_send){ // there are active orders

int long_ticket = -1;

int short_ticket = -1;

bool no_active_order = true;

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUYSTOP)

long_ticket = OrderTicket();

if(OrderType() == OP_SELLSTOP)

short_ticket = OrderTicket();

if(OrderType() == OP_BUY ||

OrderType() == OP_SELL) // Active order

no_active_order = false; }

}

if(short_ticket == -1 && long_ticket != -1)

OrderDelete(long_ticket);

if(long_ticket == -1 && short_ticket != -1)

OrderDelete(short_ticket);

if(long_ticket == -1 && short_ticket == -1 && no_active_order &&

Hour() != look_price_hour && Minute() >= look_price_min)

clear_to_send = true;

if(Hour() == (look_price_hour-1) &&

MathAbs(Minute() - look_price_min) < 10)

clear_to_send = true;

}

//----

return(0);

}

 

Em relação ao meu cargo anterior,

Parece que o "clear_to_send = falso;" não está mudando após a ordem pendente. Alguma idéia?

Isto aconteceu uma vez que faço do pivô meu ponto de referência para ordens pendentes. Se eu não conseguir resolver esta lógica, acho que tentarei descobrir como fazer referência a um pivô a partir de um indicador e chamá-lo da EA. Não tenho certeza se isso é possível, mas vejo isso como minhas opções.

Qualquer conselho ou assistência é bem-vinda.

 

extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.

extern int look_price_min = 35; // Offset in minutes when to look on price.

extern int close_hour = 12; // Close all orders after this hour

bool use_close_hour = true; // set it to false to ignore close_hour

int take_profit = 20;

extern int Currency_Spread = 4;

int open_long = 21;

int open_short = 21;

int stop_long = 30;

int stop_short = 30;

extern int slippage = 0;// Put what your brooker requires

extern double lots = 0.20; // Position size

extern int magic = 123;

bool clear_to_send = true;

void ReportStrategy()

{

int totalorders = HistoryTotal();

double StrategyProfit = 0.0;

double StrategyProfitOpen = 0.0;

int StrategyOrders = 0;

int StrategyOrdersOpen = 0;

for(int j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrders++;

StrategyProfit += OrderProfit();

}

}

}

totalorders = OrdersTotal();

for(j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrdersOpen++;

StrategyProfitOpen += OrderProfit();

}

}

}

Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",

StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",

"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));

return;

}

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

//| expert initialization function |

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

int init()

{

//----

ReportStrategy();

//----

return(0);

}

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

//| expert deinitialization function |

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

int deinit()

{

//----

//----

return(0);

}

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

//| expert start function |

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

int start()

{

ReportStrategy();

if(Hour() >= close_hour &&

use_close_hour){

// we are after closing time

int totalorders = OrdersTotal();

for(int j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

return(0);

}

if(Hour() == look_price_hour &&

Minute() >= look_price_min &&

clear_to_send){

// Probably I need to close any old positions first:

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

}

double PIVOT;

PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;

// Send orders:

if (clear_to_send){

OrderSend(Symbol(),

OP_BUYSTOP,

lots,

PIVOT+(open_long+Currency_Spread)*Point, // Spread included

slippage,

PIVOT+((open_long+Currency_Spread)-stop_long)*Point,

PIVOT+((open_long+Currency_Spread)+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

OrderSend(Symbol(),

OP_SELLSTOP,

lots,

PIVOT-open_short*Point,

slippage,

PIVOT-(open_short-stop_short)*Point,

PIVOT-(open_short+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

clear_to_send = false; // mark that orders are sent

}

if(!clear_to_send){ // there are active orders

int long_ticket = -1;

int short_ticket = -1;

bool no_active_order = true;

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUYSTOP)

long_ticket = OrderTicket();

if(OrderType() == OP_SELLSTOP)

short_ticket = OrderTicket();

if(OrderType() == OP_BUY ||

OrderType() == OP_SELL) // Active order

no_active_order = false; }

}

if(short_ticket == -1 && long_ticket != -1)

OrderDelete(long_ticket);

if(long_ticket == -1 && short_ticket != -1)

OrderDelete(short_ticket);

if(long_ticket == -1 && short_ticket == -1 && no_active_order &&

Hour() != look_price_hour && Minute() >= look_price_min)

clear_to_send = true;

if(Hour() == (look_price_hour-1) &&

MathAbs(Minute() - look_price_min) < 10)

clear_to_send = true;

}

//----

return(0);

}

Experimente este código.

 

Ryanklefas ,

Você é brilhante simplesmente brilhante nesta área.

Os testes que fiz de sua modificação funcionaram.

Não sei por que a adição da lógica pivot interferiu na lógica atual do "se". Provavelmente eu precisava estabelecer o código do pivô em um local diferente. Entretanto, vejo como vocês isolaram o código do pedido pendente e isso funciona até agora.

Obrigado pela URL que me indicou exemplos de código. Isso será um grande recurso à medida que eu melhorar minhas habilidades de programação.

Acho interessante/frustrante como a solução de um problema às vezes causa outro.

Problema atual: Agora preciso descobrir porque este código só permite pedidos pendentes de preços com 5 dígitos e não 3.

Exemplo: 1.1234 funciona bem, mas 1.12 dá um erro de que 1.123333 não é um preço válido para OrderSend.

Portanto, funciona em GBP/USD, mas não em USD/JPY.

Mais uma vez, obrigado por seu tempo.

 
proverbs:
Ryanklefas ,

Você é brilhante simplesmente brilhante nesta área.

Obrigado.

Quanto ao seu problema:

Antes de enviar os valores do pivô para a função OrderSend, certifique-se de que você tenha normailizado então com a função NormalizeDouble; use o valor pré-definido "Dígitos" como segundo parâmetro para arredondar o dobro para o nuimber de dígitos apropriado para sua moeda.

 
waaustin:
meu problema tem sido como arredondar o valor calculado para a casa decimal mais próxima.

Acho que a função normalizarDupla também funcionaria para você. Também já vi código que usa as funções MathFloor e MathCeiling para realizar a mesma coisa.

 

Outra ajuda

Alguém pode me dizer como fazer isso?

Arquivos anexados:
chart.gif  18 kb
 
hellkas:
Alguém pode me dizer como fazer isso?

Acho que está relacionado a esta linha https://www.mql5.com/en/forum/176969

 

Definir a cor do nível em código

Alguém pode me mostrar como posso ajustar o nível1 30 para Verde e o nível2 70 para Vermelho ?

#disponível_separarate_window

#property indicator_buffers 1

#indicador de propriedade_color1 DodgerBlue

#indicador de propriedade_nível1 30

#indicador de propriedade_nível2 70

#indicador de propriedade_mínimo 0

#indicador de propriedade_máximo 100

Obrigado de antemão

 
highway3000:
Alguém pode me mostrar como posso ajustar o nível1 30 para Verde e o nível2 70 para Vermelho ?

#janela_indicadora de propriedade_separarate_window

#property indicator_buffers 1

#indicador de propriedade_color1 DodgerBlue

#indicador de propriedade_nível1 30

#indicador de propriedade_nível2 70

#indicador de propriedade_mínimo 0

#indicador de propriedade_máximo 100

Obrigado de antemão

Penso que esta seção do MetaEditor será o que você está procurando:

Referência MQL4 - Fundamentos - Pré-processador - Compilação de controle

Razão: