Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта? - страница 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. Посмотрите на свой пост там