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

 

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

Эксперт: покупка- пересечение стохастика и сигнальной в зоне перепроданности (ниже 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
 
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);
     }
 
На том же самом месте слил весь депозит!
 

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

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

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

 
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; 
 

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

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

?
 

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

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

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




 
D500_Rised:

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

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

?

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

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

 
Тогда Вам надо сделать запрет на внутрибаровою тоговлю проидитесь по поиску с этими ключевыми словами, найдете.
 
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);
}
 

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

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