[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 767

 
FoxUA:

はい、コードの一部が動作し、一部は4107と130エラーと言う、最も興味深いのは、彼らは1と同じ関数から価格を取り、1と同じオープニング関数で動作することです。


次のような構造をどこかで試してみてください。この例は私の場合です。

if (OrderSend(Symbol(),OP_BUYSTOP,Lot,OpenPrice,0,Ask,0,0,Mg,0,Red)== -1)
Print("Error 1 OP_BUYSTOP ",")Open=",OpenPrice,"Stop Loss=",Ask, "Trall=",TrallBuy, "StopLoss=",StopLoss) ;

結果は
のログをご覧ください。

 

目利きの皆さん、こんにちは。このコードを理解するのを助けてください...

//+------------------------------------------------------------------+
///オープンポジションの計算
//+------------------------------------------------------------------+
int CalculateCurrentOrders(文字列シンボル)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)ブレーク。
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICEA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- リターンオーダー数
if(buys>0) return(buys);
else return(-sells);
}

//+------------------------------------------------------------------+
//| 最適なロットサイズを計算する
//+------------------------------------------------------------------+
double LotSize(){。
double lotMM;
if(PairsTraded=0){。
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000) / 10;
} else {
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000 /PairsTraded) / 10 ;
}
if (MM==true){。
if (lotMM < 0.1) lotMM = Lots;
if (lotMM > 1.0) lotMM = MathCeil(lotMM);
if (lotMM > 100) lotMM = MaxLots;
}
else lotMM = Lots;
を返します(lotMM)。
}

//+------------------------------------------------------------------+
//| 開注文条件のチェック
//+------------------------------------------------------------------+
void CheckForOpen()
{
double CCI5,CCI15,CCI30,CCIH1,CCIH4;
を送信します。

//----MultitimeFrame CCI設定


CCI5 = iCCI(NULL,PERIOD_M5,50,PRICE_CLOSE,0);
CCI15 = iCCI(NULL,PERIOD_M15,50,PRICE_CLOSE,0);
CCI30 = iCCI(NULL,PERIOD_M30,50,PRICE_CLOSE,0);
CCIH1 = iCCI(NULL,PERIOD_H1,50,PRICE_CLOSE,0);


//----


//---- 販売条件
if ((CCIH1<0)&&(CCI30<0)&&(CCI15<0)&&(CCI5<0))//op 売り
{
send=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,MagicName+"-Sell",MAGICEA,0,Red);
を返します。
}

//---- 買付条件
if ((CCIH1>0)&&(CCI30>0)&&(CCI15>0)&&(CCI5>0))//op 買いのみ
{
send=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,MagicName+" -Buy",MAGICEA,0,Blue) です。
を返します。
}
}

//----

//+------------------------------------------------------------------+
//|寄り付き注文の条件をチェックする|||etc.
//+------------------------------------------------------------------+
void CheckForClose()
{
//----


//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)ブレーク。
if(OrderMagicNumber()!=MAGICEA || OrderSymbol()!=Symbol()) continue;

//---- チェックオーダータイプ
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-TrailingStop*Point > OrderStopLoss()){ (OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-TrailingStop*Point > OrderSimps)

if (Bid > Order OpenPrice()+TrailingStop*Point) {.
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,0,0,White)。
}
} else {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-1*Point,0,0,White);
}
if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && Ask-TrailingStop*Point < OrderStopLoss()){ (OrderSymbol()==Symbol() && OrderType()==OP_SELL && Ask-TrailingStop*Point < OrderStopLoss())

if (Ask < Order OpenPrice()-TrailingStop*Point) {.
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,0,0,White)を実行。
}
} else {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+1*Point,0,0,White);
}
}

//----
}
//+------------------------------------------------------------------+
//| 機能開始
//+------------------------------------------------------------------+
void start()
{
//---- 履歴と取引を確認する
if(Bars<100 || IsTradeAllowed()==false) return;

//---- 現在のシンボルで未決済注文を計算する
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose()。

//----
}
//+------------------------------------------------------------------+

1ポジションだけ開いて、閉じた後は二度と開かないようにしたいのに、閉じた後に1ポジション開いてしまい、また開いてしまうのです。

 
mydone:

目利きの皆さん、こんにちは。このコードを理解するのを助けてください...

...コード ...

私はそれが形成された条件の下で1つのトランザクションのみを開き、その閉鎖後、次の条件まで、これ以上開かないようにする必要があります...しかし、私はそれが開き、私は例えばウィンドウを閉じ、それは何のために同じ場所で再び開くということです?

持っているので、開封条件がある限りは開封されます。

例えば、bool OpnPose = false; このシグナルによってポジションをオープン する前に、このフラグをチェックし、セットされていない場合(OpnPose == false)、ポジションをオープンします。オープンしたとき、本当にオープンしてマーケットにいれば、このシグナルによってオープンするフラグを立てる:OpnPose = true。新しいシグナルが来たら、すぐにこのシグナルを破棄する:
OpnPose = false;

 
はい、我々は、信号がトリガされた後、それが手動で閉じると、他の何も開かないように、2つまたは3つのキャンドル内に何も開かないようにカウンタを入れて、カウンタは、ろうそくのカップルの後に開封禁止をキャンセルする、よりシンプルにすることができます。
 

ありがとうございました。

 
Techno:
はい、我々は、信号がトリガされた後、それが手動で閉じると、他の何も開かないように、2つまたは3つのキャンドル内に何も開かないようにカウンタを入れて、カウンタは、ろうそくのカップルの後に開封禁止をキャンセルする、よりシンプルにすることができます。
そして、禁止が解除された後、EAが再び注文をマーケットに出す...。EAが10、15、または20のローソク足でポジションを閉じることを決定し、たとえシグナルがまだ存在していたとしても、再びオープンしない場合はどうなりますか?例えば金曜日は...
 
artmedia70:
そして、禁止が解除された後、EAがその注文をマーケットに戻す...。そして、それは10、15、20キャンドル後にポジションを閉じると、信号がまだそこにある場合でも、再び開くしないことを決定した場合?例えば金曜日は...
1本のロウソクの後でも、考慮しなければならない全く別のシグナルが存在します。最初のシグナルが消えるまで、ローソク足3本分待てば十分です。ちなみに、5、15、30、60分足のインジケータを使うので、30分足や15分足のローソク足が3本あれば十分です。
 

私の質問は、ちょうど反対の例から新しい注文がある場合はどうすればよいのです "閉じた順序がある場合if(TotalHistoryOrders<OrdersHistoryTotal())/別の順序は、履歴に現れている "と私はオープン1も決定する必要があることです

 
FoxUA:

私の質問は、ちょうど反対の例から新しい注文がある場合はどうすればよいのです "閉じた順序がある場合if(TotalHistoryOrders<OrdersHistoryTotal())/別の順序は、履歴に現れている "と私はオープン1も決定する必要があることです

ループしているオーダーの数が変わったら、新しいオーダーが入ったか、消えてしまったか...。
 
Techno:
すべてのオーダーを確認し、不要なものを取り除くとき、その数を数え、記憶し、新しいサイクルでその数が変わったなら、それは新しいオーダーが現れたか、消えたかのどちらかであるということです。


私はただ関数を呼び出すだけでいいのです。私はただ1行「もし注文が1より多ければ・・・」が必要なのです。それだけだ」と言いながら、全機能を提供する。

注文に関するデータはこのように保存しています

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic