double Lot = 0.1; //я проинициализировал переменнуюint Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point)) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
t=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула ??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
if ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
double Lot=0.1;
int Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если ПРИ ЭТОМ цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
{ Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
Lot=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
} return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
これは、関数bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) のコードの一部分です。
しかし、3pipsのスリップがあった場合はどうでしょうか?あまりよく考えられていない ))
if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
こんにちは。
私の戦略はスプレッドを考慮したもので、スプレッドは関数で定義されています。
しかし、ストラテジーテスターでは スプレッドが一定なので、ランダムスプレッドエミュレーターが必要なのです。2~3ポイント(4桁)の範囲で80%、3ポイント以上の範囲で20%の割合でテスターでの広がりの変化をエミュレートしたいです。どのように実装すればよいか、また、そのようなアイデアが解決されたリンクがあれば教えてください。
マジシャンのミスにより、EAがストップでクローズしたときに、そのポジションがストップでクローズしたことを認識しないことがあります。なぜ?答えは、マジック123でポジションを開き、ストップでポジションを閉じるかどうかをチェックする関数に変数Magicを送るというものです。暗黙のうちに初期化された場合、何に相当するのでしょうか?ゼロです。この機能は、当然ながらマジックナンバー0を持つポジションを検索し、それが自分のポジションで123と等しくなるようにします。そして、私たちは議論しているのではなく、ただ...推理...停止時に閉じるレスポンスを確認する。
私はあなたの「死んだ」EAロジックの残りを見ていません - 私はあなたがストップクローズチェック機能を理解するのを手伝っていたのですが...。
Artem !ごきげんよう! いつもありがとうございます。
不要な「死語」ロジックをすべて削除し、残ったものを「復活」させた......。私の理解する限りでは
1つの機能だけを残し、それを修正するのに役立っています。
しかし、私の理解を超えた奇跡が起こり始めたのです。
1. Expert Advisorは各ロー ソク足の最初に取引を開始します(私は5分のローソク足を持っています)。
と条件をすべて無視する。
すなわち、コントロールは最初の行に入る
double Price=iOpen(Symbol (),0,0);
そして、11行を飛び越え、次の行にたどり着きます。
Lot=0.1;
OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123 );
2. 最小ロットを計算する行を削除した場合 Lot=MarketInfo(Symbol(), MODE_MINLOT);
Expert Advisorは問題なく動作しますが、isCloseLastPosByStop関数が動作 しません。
ずっと頭を悩ませていたのですが......無駄でした。 どこにエラーが隠れているのか、教えていただけるとありがたいです。
solnce600。
Артем ! Добрый день! Еще раз спасибо за помощь.
私の「死んだ論理」はすべて不要なものを取り除き、残りを「復活」させる...。私の理解する限りでは
実質的に機能だけを残したのですが、それを修正するのに協力していただきました。
しかし、私の理解を超えた奇跡が起こり始めている。
後
ボディにすべてを追加する { } 。
アルテムじゃなくてごめんね。
solnce600。
後
ボディにすべてを追加する { } 。
アルテムじゃなくてごめんね。
t or Lot ?
solnce600。
後
ボディにすべてを追加する { } 。
アルテムじゃなくてごめんね。
あなたが言ったようにした...残念ながらアドバイザーが動作...isCloseLastPosByStop関数が動作しません。
これは、関数bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) のコードの一部分です。
しかし、3pipsのスリップがあった場合はどうでしょうか?あまりよく考えられていない ))
わかってくれるかな~、まだあまり気にしてないんだけど...。
なぜこの機能が使えないのか、1週間ほど試行錯誤しています。
つまり、ストップで決済した注文の2倍の出来高で、ノンストップ後の次の注文は通常の出来高で開いてほしいのです。
仕事の論理を正さないと、考える時間が長くなる
これは、関数bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) のコードの一部分です。
しかし、3pipsのスリップがあった場合はどうでしょうか?あまりよく考えられていない ))
わかってくれるかな~、まだ悩んでないけど...。
なぜこの機能が思い通りに動かないのか、1週間ほど試行錯誤を続けています。
つまり、ストップで決済した注文の2倍の出来高で、ノンストップの後、次の注文を通常の出来高で開く必要があります。そして、なぜ注文履歴 を触るかというと、残高を見て、どこがその方向に行ったか、ロットを変えてください。
自分の口座で取引してくれるロボットだけなら。