Ayuda con la codificación... ¿Cómo puedo hacer que el indicador filtre en lugar de alertar? - página 7

 
Maji:
Lo siento, no tengo tiempo para examinar todo el código, pero vamos a examinar sólo este fragmento.

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

Digamos que el OrderOpenPrice = 1,2100

y el beneficio es de 0,0010

Entonces, usted quiere cerrar la operación corta si la oferta es menor o igual a 1.2100-0.0010 = 1.2090.

Supongamos que hubo una brecha a la baja y los precios se saltaron 1,2090 y el precio de oferta ahora es 1,2088. Según su fórmula

Bid + Profit = 1,2088 + 0,0010 = 1,2098. NO es mayor que OrderOpenPrice aunque su sistema haya superado el umbral de beneficio. Por lo tanto, la orden no se cerrará. La lógica de la condición de cierre necesita ser reevaluada y reestructurada, en mi opinión. Además, usted debe tratar con los precios de venta cuando se trata de operaciones cortas, ya que sólo puede cerrar la operación al precio de venta.

Otro consejo,

El bucle de conteo de for (int cnt = 0 ; cnt = 0; cnt--) o algo similar.

Buena suerte.

Te agradezco que hayas aprendido esto, ¡gracias Maji! De todas formas esta no es la lógica de cierre que quería en esto... la lógica que quería era que se cerrara SI no había disparado el trailing stop loss. Como no entiendo exactamente cómo detectar si eso se dispara o no no puedo usar esta estrategia de cierre por tiempo hasta que aprenda a programarla para que haga lo que yo pretendía.

 

Nuevo criterio de cierre...ayudenme a colocar bien el código por favor...

Estoy necesitando ayuda para poner otro criterio de cierre que es que el longEMA vaya por debajo del minortrendsetter (si es largo) y viceversa si es corto. No sé exactamente cómo aislar las posiciones abiertas largas y cortas para cerrarlas con este nuevo 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 necesito entender esta parte del código ahora....

la primera línea cuenta

la segunda línea selecciona las órdenes contadas

tercera línea... esto me engaña... PIENSO que quiere saber si la orden seleccionada es una venta... pero ¿qué pasa con el "0? Quiero decir que hay CINCO líneas 'if' aquí...

Supongo que si alguna de ellas es verdadera entonces modificará la orden de lo contrario...supongo que va a la línea ..'else' y ...bueno esto de alguna manera debe manejar tanto las posiciones largas como las cortas pero no lo entiendo todavía.

Ya que quiero añadir criterios para cerrar largos o cortos basados en el cruce del longEMA con el minortrendsetterEMA...no estoy seguro de donde en todo esto hacerlo.

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 entiendo que todos los if's y elses llevan a las líneas thess. estas son las que necesito entender..

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

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

Necesito aprender más sobre cómo se construyen estas líneas de modificación de órdenes... ¿son las que se cierran además de cambiar las órdenes? o ¿sólo cambian las órdenes y algo más las cierra?

 

Mira la ayuda en el 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) ...

Sólo hay que teclear menos

 

Aquí tienes

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

}

}

}

Llámalo : CloseOrder(OP_BUY); // Cierra todas las órdenes de compra

o

CloseOrder(OP_SELL); // Cerrar todas las órdenes de venta

La razón por la que estoy guardando todas las entradas de órdenes en un array y luego las borro es porque cuando cierro la orden en la posición # 1 entonces la siguiente vuelve a ser 1 y tenemos un problema.

 

Me olvido de este

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

 

Todavía estoy confundido...

Entienda que yo no he creado este código originalmente. Estoy trabajando para entender lo que alguien hizo y modificarlo. Puse mi nombre en la línea de propiedad sólo ahora que lo he modificado tanto que ya se parece poco al original. Ahora he modificado más de lo que he dejado intacto. Todavía hay algunos aspectos que no entiendo y por eso no he podido modificar.

Lo que busco es el código que cierra las órdenes... parece que todo esto es sólo modificar para actualizar el trailing stop.

esto es más de una forma de cerrar.

ahora mismo este EA tiene la posibilidad de cerrar con un stop loss.

cerrar con un trailing stop.

cerrar con un objetivo de toma de beneficios.

o para cerrar en base al paso de algún tiempo definido después de la apertura.

Lo que no tiene y quiero que tenga es la capacidad de cerrar si el longEMA retrocede sobre el minortrendsetterEMA. podría hacer esto cruzando hacia arriba para cerrar una posición corta o cruzando hacia abajo para cerrar una posición larga. ¿Cómo puedo hacer que hacer eso? Es decir, con todas estas otras opciones de cierre, ¿dónde pongo el nuevo código para superar todas estas otras opciones de cierre?

En mi expirementation cuando no quiero utilizar algún aspecto de este simplemente hacer los criterios de ese parámetro tan extrema que nunca va a desencadenar que es como convertir ese criterio básicamente fuera. Hacer eso permite que el juego de los otros criterios para mostrar lo que devolvería.

 
elihayun:
Se me olvida este
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

Bien, gracias.

¿Entonces esto es básicamente sólo un código de cierre?

¿Cerrará esto tanto las posiciones largas como las cortas abiertas?

¿Cómo podría usar esto para cerrar si el longema cruzara de nuevo sobre el minortrendsetterema? ¿Cruzando hacia arriba si hubiera abierto en corto y cruzando hacia abajo si hubiera abierto en largo?

p.d. No volveré al ordenador hasta la tarde. Ya lo comprobaré entonces.

 

una pregunta más...

¿qué significa "intercambio"?

 

Cada vez que decida abrir una posición LONG llame: CloseOrders(OP_SELL);

y viceversa.

Mira tu código donde estás abriendo las órdenes.

No tienes que comprobar si hay una orden para cerrar. La rutina lo hará por ti.

Por cierto, he publicado un código para convertir 2006.07.02 tipo de celda a la fecha en Excel. Mira tu post allí

Razón de la queja: