Скачать MetaTrader 5

Вопрос к знатокам

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен программист? Cервис Фриланс найдет его!
Константин Скворцов
494

Здравствуйте. Знатоки програмирования помогите.

Эксперт: покупка- пересечение стохастика и сигнальной в зоне перепроданности (ниже 25), и при том условии что

Pivot находится ниже уровня цен (своеобразная поддержка); продажа все сточностью наоборот, Pivot выше уровня цен.

Тестирование показало недочеты програмирования. 1) как сделать чтобы открывалась только одна сделка на один сигнал (в процессе тестирования все слил, когда сигнал еще действует (ложный) и уже наступило условие закрытия позиции). 2) правильно ли я задал условие что Pivot находится выше/ ниже уровня цен. возникло сомнение, глядя на график тестирования.

Господа програмисты помогите если можно с конкретными примерами. А то я владею програмированием на уровне простой компиляции!!!!!!!

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Bars<100)
{
Print("bars less than 100");
return(0);
}
P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,"Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные

total=OrdersTotal();
if(total<1)
{
// Проверка свободной маржи
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// Условие открытие позиции BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,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);
}
// Условие открытие позиции SELL
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,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);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // длинная позиция открыта
{
// условие закрытие длинной позиции
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
}
else
{
// условие закрытия короткой позиции
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}




Файлы:
pivot.mq4 2 kb
Юрий
757
Юрий 2008.06.06 09:54  
Kostay:

Здравствуйте. Знатоки програмирования помогите.

Эксперт: покупка- пересечение стохастика и сигнальной в зоне перепроданности (ниже 25), и при том условии что

Pivot находится ниже уровня цен (своеобразная поддержка); продажа все сточностью наоборот, Pivot выше уровня цен.

Тестирование показало недочеты програмирования. 1) как сделать чтобы открывалась только одна сделка на один сигнал (в процессе тестирования все слил, когда сигнал еще действует (ложный) и уже наступило условие закрытия позиции). 2) правильно ли я задал условие что Pivot находится выше/ ниже уровня цен. возникло сомнение, глядя на график тестирования.

Господа програмисты помогите если можно с конкретными примерами. А то я владею програмированием на уровне простой компиляции!!!!!!!

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Bars<100)
{
Print("bars less than 100");
return(0);
}
P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,"Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные

total=OrdersTotal();
if(total<1)
{
// Проверка свободной маржи
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// Условие открытие позиции BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,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);
}
// Условие открытие позиции SELL
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,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);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // длинная позиция открыта
{
// условие закрытие длинной позиции
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
}
else
{
// условие закрытия короткой позиции
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}

1) как сделать чтобы открывалась только одна сделка на один сигнал

надо вот так:

if(total<1) 
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
         

if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Alert("Покупка: ",OrderOpenPrice());                      
           }
         else Alert("ошибка:по цене ",OrderOpenPrice()); 
         return(0); 
        }
        
        
     return(0);
     }
Константин Скворцов
494
Константин Скворцов 2008.06.06 10:19  
На том же самом месте слил весь депозит!
Константин Скворцов
494
Константин Скворцов 2008.06.06 11:20  

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

И все-таки как можно запрограмировать чтобы открывалась только одна позиция на один сигнал,

и если позиция на этом же баре была закрыта (то есть сигнал еще действует) то новая не должна открываться.

Александр
1082
Александр 2008.06.06 11:39  
Kostay:

...И все-таки как можно запрограмировать чтобы открывалась только одна позиция на один сигнал,

и если позиция на этом же баре была закрыта (то есть сигнал еще действует) то новая не должна открываться.

Если время открытия ордера, в том числе и закрытых, принадлежит текущему бару (на котором появился сигнал), то курим на заборе.

Примерно так:

bool flag=true;
int cnt=OrdersTotal()-1;
for(int i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
if(!flag) return; 
Denny
459
Denny 2008.06.06 11:52  

Как может быть открыто более 1 позиции одновременно если присутствует это:

total=OrdersTotal();
if(total<1)

?
Константин Скворцов
494
Константин Скворцов 2008.06.06 11:58  

Вставил Ваш код в советник. но результат такой же.

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

extern double Lots = 0.1;
bool flag=true;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Bars<100)
{
Print("bars less than 100");
return(0);
}
P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,"Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные

total=OrdersTotal();
if(total<1)
{
// Проверка свободной маржи
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// Условие открытие позиции BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Alert("Покупка: ",OrderOpenPrice());
}
else Alert("ошибка:по цене ",OrderOpenPrice());
return(0);
}
int cn=OrdersTotal()-1;
for(int i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
flag=false;
break;
}
}
if(!flag) return;
// Условие открытие позиции SELL
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Alert("Покупка: ",OrderOpenPrice());
}
else Alert("ошибка:по цене ",OrderOpenPrice());
return(0);
}
int c=OrdersTotal()-1;
for(int a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
flag=false;
break;
}
}
if(!flag) return;
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // длинная позиция открыта
{
// условие закрытие длинной позиции
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
}
else
{
// условие закрытия короткой позиции
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}




Константин Скворцов
494
Константин Скворцов 2008.06.06 12:04  
D500_Rised:

Как может быть открыто более 1 позиции одновременно если присутствует это:

total=OrdersTotal();
if(total<1)

?

Вы не так поняли. не открывается одновременно более 1 позиции!!!!!!! сигнал появился - позиция открылась. на этом же нулевом баре цена пошла в обратном направлении и действует услвие закрытия позиции. она соответственно закрывается, на этом же нулевом баре. Но действие сигнала ни кто не отменял. и открывается соного позиция, и снова закрывается, так как идет в обратном направлении.

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

Rustamzhan Salidzhanov
7683
Rustamzhan Salidzhanov 2008.06.06 12:14  
Тогда Вам надо сделать запрет на внутрибаровою тоговлю проидитесь по поиску с этими ключевыми словами, найдете.
Александр
1082
Александр 2008.06.06 12:27  
Kostay:

Вставил Ваш код в советник. но результат такой же.

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

Пожалуйста, только в следующий раз вставляйте код через кнопку

Ошибок быть не должно, но не проверял.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double P_up0,P_down0,P_up1,P_down1;
   double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
   st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
   st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
   st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
   st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
   Pivot=iCustom(0,0,"Pivot",0,1);
   ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные 

// Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
      
// Условие открытие позиции BUY
   if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
Константин Скворцов
494
Константин Скворцов 2008.06.06 13:07  

Странное творится теперь с советником. несрабатывает заложенное закрытие позиций. может быть открыто и действовать одновременно несколько позиций однотипных. И результат: все сливает по той же самой проблеме, правда в видоизмененном варианте!!??

12345678...21
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий