Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта? - страница 7

 
Maji:
К сожалению, у меня нет времени рассматривать весь код, но давайте рассмотрим только этот фрагмент.

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

Допустим, что цена открытия ордера = 1.2100

а прибыль составляет 0.0010

Таким образом, вы хотите закрыть короткую сделку, если ставка меньше или равна 1.2100-0.0010 = 1.2090.

Предположим, что произошел гэп вниз, и цены проскочили 1,2090, а цена предложения теперь составляет 1,2088. Согласно вашей формуле,

Bid + Profit = 1.2088 + 0.0010 = 1.2098. Это НЕ больше, чем OrderOpenPrice, даже если ваша система превысила порог прибыли. Таким образом, ордер не будет закрыт. На мой взгляд, логику условия закрытия нужно пересмотреть и переписать. Кроме того, при работе с короткими сделками следует иметь дело с ценами Ask, поскольку закрыть сделку можно только по цене ask.

Еще один совет,

Цикл подсчета for (int cnt = 0 ; cnt = 0; cnt--) или что-то подобное.

Удачи.

Я ценю то, что узнал об этом, спасибо Maji! В любом случае, это не та логика закрытия, которую я хотел... логика, которую я хотел, заключалась в том, чтобы сделка закрывалась, если не сработал трейлинг-стоп. Так как я не понимаю, как именно определить, сработал он или нет, я не могу использовать эту стратегию закрытия по времени до закрытия, пока не узнаю, как запрограммировать ее так, чтобы она делала то, что я задумал.

 

Новый критерий закрытия... помогите мне правильно разместить код, пожалуйста...

Мне нужна помощь в установке еще одного критерия закрытия, который заключается в том, что longEMA опускается ниже minortrendsetter (если длинная позиция) и наоборот, если короткая. Я не уверен, как именно изолировать длинные и короткие открытые позиции, чтобы закрыть их с помощью этого нового критерия.

#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---------------+
 

Хорошо, мне нужно понять эту часть кода сейчас....

первая строка подсчитывает

вторая строка выбирает подсчитанные ордера

третья строка... она меня обманывает... Я ДУМАЮ, что она хочет узнать, является ли выбранный ордер продажей... но что там с "0? Я имею в виду, что здесь есть ПЯТЬ строк "если"...

Я предполагаю, что если хоть одна из них верна, то он изменит ордер, иначе... я предполагаю, что он переходит к ...'else' и ... ну, это как-то должно справляться с длинными и короткими позициями, но я пока не понимаю этого.

Поскольку я хочу добавить критерии для закрытия длинной или короткой позиции на основе пересечения longEMA с minortrendsetterEMA... я не уверен, где во всем этом сделать это.

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

}

}

}

}

Я понимаю, что все if's и elses ведут к строкамss. Вот те, которые мне нужно понять...

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

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

Мне нужно больше узнать о том, как строятся эти линии модификации ордеров... это те, которые закрывают, а также изменяют ордера? или они просто изменяют ордера, а что-то другое закрывает ордера????

 

Посмотрите справку в 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) ...

Просто меньше печатайте

 

Вот так

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

}

}

}

Вызовите его: CloseOrder(OP_BUY); // Закрыть все ордера на покупку

или

CloseOrder(OP_SELL); // Закрыть все ордера на продажу

Причина, по которой я сохраняю все билеты ордеров в массиве, а затем удаляю, заключается в том, что когда я закрываю ордер в позиции № 1, следующий ордер снова становится 1, и у нас возникает проблема.

 

Я забыл этот

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

 

Я все еще в замешательстве...

Поймите, что я не создавал этот код изначально. Я работаю над тем, чтобы понять, что сделал кто-то другой, и модифицировать его. Я поместил свое имя на линию собственности только сейчас, когда я изменил его настолько, что он уже мало похож на оригинал. Сейчас я изменил больше, чем оставил нетронутым. Есть еще некоторые аспекты, которые я не понимаю и поэтому не смог изменить.

Я ищу код, который закрывает ордера... кажется, что все это просто модификация для обновления трейлинг-стопа.

это более чем один способ закрытия.

прямо сейчас этот советник имеет возможность закрываться со стоп-лоссом.

закрыться с трейлинг-стопом.

закрытие с целью тейк-профита.

или закрываться по истечении определенного времени после открытия.

Чего у него нет, но я хочу, чтобы у него была возможность закрыться, если длинная ТЕМА вернется обратно к минимальной ТЕМА трендсеттера. Он может сделать это, пересекая вверх, чтобы закрыть короткую позицию или пересекая вниз, чтобы закрыть длинную позицию. Как мне сделать так? Я имею в виду, со всеми этими другими вариантами закрытия, куда мне поместить новый код, чтобы превзойти все эти другие варианты закрытия?

В моей экспирации, когда я не хочу использовать какой-то аспект этого, я просто делаю критерии этого параметра настолько экстремальными, что он никогда не сработает, то есть как бы выключаю этот критерий. Это позволяет другим критериям играть так, чтобы показать, что они вернутся.

 
elihayun:
Я забыл вот это
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

Хорошо, спасибо!

Значит, это, по сути, только код закрытия?

Закрывает ли он открытые длинные и короткие позиции?

Как бы я использовал его для закрытия, если бы лонгема пересеклась обратно на минитрендсеттерему? Пересечение вверх, если бы открылась короткая позиция, и пересечение вниз, если бы открылась длинная?

p.s. Я не вернусь к компьютеру до позднего вечера. Тогда и проверю.

 

еще один вопрос...

что означает "своп"?

 

Каждый раз, когда вы решаете открыть позицию LONG, звоните : CloseOrders(OP_SELL);

и наоборот.

Посмотрите на свой код, где вы открываете ордера.

Вам не нужно проверять, есть ли ордер на закрытие. Процедура сделает это за вас.

BTW, я разместил код для преобразования 2006.07.02 kinda cell в дату в excel. Посмотрите на свой пост там

Причина обращения: