目利きの方に質問です

 

こんにちは。プログラミングの専門家がお手伝いします。

エキスパートアドバイザー:買い - ストキャスティクスの交差と売られ過ぎの領域(25以下)で信号、条件の下で。

ピボットが価格水準より下にある場合(一種のサポート)、逆に、ピボットが価格水準より上にある場合です。

テストでは、プログラミング上の欠陥がいくつか見られました。1) シグナルごとに1回だけ取引を行う方法(テスト中に、シグナルがまだ有効(偽)で、ポジション閉鎖条件がすでに発生しているときに、すべてを失いました)。2) Pivotが価格水準より上か下かという条件を正しく設定できたかどうか。 テスト中のグラフを見ると疑問があるのですが。

具体的な事例でお役に立てることがあれば。プログラミングは簡単なコンパイルのレベルで知っている !!!!

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1。
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.フリーマージン = ", 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(チケット>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0)です。
}
//売りのポジションを開く
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(チケット>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)です。
}
}
さもなくば
{
// ショートポジションの決済条件
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)を実行します。
return(0)です。
}
}
}
}
return(0)です。
}




ファイル:
pivot.mq4  2 kb
 
Kostay:

こんにちは。プログラミングの専門家がお手伝いします。

エキスパートアドバイザー:買い - ストキャスティクスの交差と売られ過ぎの領域(25以下)で信号、条件の下で。

ピボットが価格水準より下にある場合(一種のサポート)、逆に、ピボットが価格水準より上にある場合です。

テストでは、プログラミング上の欠陥がいくつか見られました。1) シグナルごとに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.フリーマージン = ", 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(チケット>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : ",OrderOpenPrice());
}
else Print("買い注文の開始エラー:",GetLastError()).Print("Error opening BUY order : ");
return(0)です。
}
//売りのポジションを開く
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(チケット>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)です。
}
}
さもなくば
{
// ショートポジションの決済条件
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)を実行します。
return(0)です。
}
}
}
}
return(0)です。
}

1) 1つのシグナルで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);
     }
 
同じ場所で預金全額を失いました!
 

このコードのどこを変更したのか、まだ理解していません。

それにしても、1つのシグナルにつき1つのポジションしか開かないようにプログラムするにはどうしたらいいのでしょうか?

また、同じバーでポジションがクローズされた場合(つまり、シグナルがまだ有効な場合)、新しいポジションはオープンされないはずです。

 
Kostay:

...しかし、信号ごとに1つのポジションしか開かないようにするには、どのようにプログラムすればよいのでしょうか?

また、同じバー上のポジションが決済された(つまり、シグナルがまだ有効である)場合、新しいポジションは開設されないはずです。

もし、クローズしたものも含めて、注文の開始時刻が 現在のバー(シグナルが出現したバー)に属していれば、フェンスの上で煙に巻かれていることになります。

だいたいそうです。

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; 
 

これがあると、どうして一度に複数のポジションを開くことができるのでしょうか。

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

?
 

EAにあなたのコードを挿入しましたが、結果は同じです。

フレームを間違って挿入してしまったようです。

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.Pivot,ma_s1;
int cnt, ticket, total;

if(Bars<100)
{
Print("bars less than 100");
return(0);
}
P_up0=iCustom(0,0, "Price channel"),11,0,0);
P_down0=iCustom(0,0, "Price channel",11,1,0);
P_up1=iCustom(0,0, "Price channel"),11,0,1);
P_down1=iCustom(0,0, "Price channel",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("Purchase: ",OrderOpenPrice());
}
else Alert("error:price ",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] - if position opens on zero bar of current symbol
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;
// 売りポジションが開く条件
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("Purchase: ",OrderOpenPrice());
}
else Alert("error:price ",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] - if position opens on zero bar of current symbol
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] - if position opens on zero bar of current symbol
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:

これがあるのに、どうして複数のポジションが同時に開いているのでしょうか。

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

?

同時に1つ以上のポジションを持つことはありません!!!シグナルが表示され、ポジションが開かれました。しかし、シグナルアクションはキャンセルされていません。それは反対方向に行くように、ポジションが開き、再び閉じます。

そこで質問ですが、1つのシグナルが新しいティックでクローズしても、1つのポジションだけをオープンするようにするにはどうしたらいいでしょうか?

 
そして、イントラバー貿易の禁止を する必要がありますこれらのキーワードで検索を通過し、それを見つけるでしょう。
 
Kostay:

EAにあなたのコードを挿入しましたが、結果は同じです。

コードを間違って挿入してしまったようです。

お願いですが、次回はボタンからコードを貼り付けて ください。

エラーは出ないはずですが、テストはしていません。

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

エキスパートアドバイザーで奇妙なことが起こっています。それは、ポジションの閉鎖で 動作していません。その結果、修正版とはいえ、すべてが同じ問題で負けているのです

理由: