Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта? - страница 7
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
К сожалению, у меня нет времени рассматривать весь код, но давайте рассмотрим только этот фрагмент.
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 (если длинная позиция) и наоборот, если короткая. Я не уверен, как именно изолировать длинные и короткие открытые позиции, чтобы закрыть их с помощью этого нового критерия.
//+--------- 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... я не уверен, где во всем этом сделать это.
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, и у нас возникает проблема.
Я забыл этот
{
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
Я все еще в замешательстве...
Поймите, что я не создавал этот код изначально. Я работаю над тем, чтобы понять, что сделал кто-то другой, и модифицировать его. Я поместил свое имя на линию собственности только сейчас, когда я изменил его настолько, что он уже мало похож на оригинал. Сейчас я изменил больше, чем оставил нетронутым. Есть еще некоторые аспекты, которые я не понимаю и поэтому не смог изменить.
Я ищу код, который закрывает ордера... кажется, что все это просто модификация для обновления трейлинг-стопа.
это более чем один способ закрытия.
прямо сейчас этот советник имеет возможность закрываться со стоп-лоссом.
закрыться с трейлинг-стопом.
закрытие с целью тейк-профита.
или закрываться по истечении определенного времени после открытия.
Чего у него нет, но я хочу, чтобы у него была возможность закрыться, если длинная ТЕМА вернется обратно к минимальной ТЕМА трендсеттера. Он может сделать это, пересекая вверх, чтобы закрыть короткую позицию или пересекая вниз, чтобы закрыть длинную позицию. Как мне сделать так? Я имею в виду, со всеми этими другими вариантами закрытия, куда мне поместить новый код, чтобы превзойти все эти другие варианты закрытия?
В моей экспирации, когда я не хочу использовать какой-то аспект этого, я просто делаю критерии этого параметра настолько экстремальными, что он никогда не сработает, то есть как бы выключаю этот критерий. Это позволяет другим критериям играть так, чтобы показать, что они вернутся.
Я забыл вот это
{
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. Посмотрите на свой пост там