コーディングの方法は? - ページ 100

 

買いのみ、売りなし

現在、買い注文のみで、売り注文はありません。

どなたか理由をご存知でしょうか?

//+------------------------------------------------------------------+

//| シグナル開始

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0)です。

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1); double sig_buy=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 注文 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| シグナル終了

//+------------------------------------------------------------------+

 

を表示させると、もう一つ問題があります。

第二段階は、おそらくあなたのiCustom()関数 です。

panteraschoice:
今のところ買いのみで、売りの注文はありません。

どなたか理由をご存じですか?

//+------------------------------------------------------------------+

//| 信号の開始

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0)です。

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1); double sig_buy=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 注文 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| シグナル終了

//+------------------------------------------------------------------+
 

未来の日付にオブジェクトを配置し、表示する?

こんにちは、MQL4がインジケータオブジェクトを未来に配置し、未来のオブジェクトを表示することをサポートしているかどうか、ご存知の方はいらっしゃいますか? ObjectMoveで未来の日付に移動してみましたが(エラーは返ってきません)、表示は最後のティックの日付で止まってしまいます。 ありがとうございます。

 

MAにはシフト機能がある...ということであれば。+2はTFバーを2つ前方にスライドさせます。-2は2つ後ろにスライドさせる。

 
IN10TION:
全体のコードを公開すると、別の問題があります...第二段階は、おそらくあなたのiCustom()関数です。

#プロパティリンク "https://www.forex-tsd.com"

extern int MagicNumber = 1001;

extern bool EachTickMode = False;

extern double Lots = 0.01;

extern int Slippage = 4;

extern bool StopLossMode = True;

extern int StopLoss = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True; extern int TakeProfit = 300; extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

extern double DecreaseFactor =3;

extern int MaxOrders = 3000;

extern bool UseHourTrade = False;

extern int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#定義 SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| エキスパートスタート機能

//+------------------------------------------------------------------+

int start() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("取引時間が来ていません!");

return(0);

}

}

int Order = SIGNAL_NONE;

int Total, Ticket;

ダブルStopLossLevel、TakeProfitLevel。

int digit = MarketInfo(Symbol(),MODE_DIGITS);

if (EachTickMode && Bars != BarCount) EachTickMode = False;

Total = OrdersTotal();

オーダー = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| シグナル開始

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0)です。

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1); double sig_buy=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 注文 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| シグナル終了

//+------------------------------------------------------------------+

//買い

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)) )){

if(ScanTrades() < MaxOrders) { (ScanTrades()の場合。

//フリーマージンチェック

if (アカウントフリーマージン() < (1000 * ロット)) { { /Check free margin

Print("資金がありません。フリーマージン = ", AccountFreeMargin());

return(0);

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

チケット = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit)。

スリッページ

NormalizeDouble(StopLossLevel,digit).NormalizeDouble(StopLossLevel)です。

NormalizeDouble(TakeProfitLevel,digit)。

"買い(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(チケット > 0) {

if (オーダーセレクト(チケット, SELECT_BY_TICKET, MODE_TRADES))Print("BUY order opened : ", OrderOpenPrice()); else Print("Error opening BUY order :", GetLastError());

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//売り

if (注文 == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))。{

if(ScanTrades() < MaxOrders) { (ScanTrades()の場合。

//フリーマージンチェック

if (アカウントフリーマージン() < (1000 * ロット)) { { /Check free margin

Print("資金がありません。フリーマージン = ", AccountFreeMargin());

return(0);

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = ビッド - TakeProfit * ポイント;

チケット = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit)。

スリッページ

NormalizeDouble(StopLossLevel,digit).NormalizeDouble(StopLossLevel)。

NormalizeDouble(TakeProfitLevel,digit)。

"売り(#" + MagicNumber + ")", MagicNumber, 0, DeepPink)。

if(チケット > 0) {

if (オーダーセレクト(チケット, SELECT_BY_TICKET, MODE_TRADES))Print("SELL order opened : ", OrderOpenPrice()); else Print("Error opening SELL order :", GetLastError());

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//ポジションチェック

for (int i = 0; i < 合計; i ++) { { {オーダーセレクト(i, SELECT_BY_POS, MOD_TRADERS)

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol())) { { {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {。

//閉じる

if (オーダー == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))){

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//トレーリングストップ

if(TrailingStopMode && TrailingStop > 0) { /トレーリングストップ

if(Bid - OrderOpenPrice() > Point * TrailingStop) { { /TrailingStopMode && TrailingStop > 0

if(オーダーストップ・ロス() < ビッド - ポイント * トレーリングストップ) { { (ビッド - ポイント * トレーリングストップ)

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen)を実行します。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber))

{

//閉じる

if (オーダー == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))。

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//トレーリングストップ

if (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - Ask) > (Point * TrailingStop) ) {

if((OrderStopLoss() > (Ask + Point * TrailingStop))|| (OrderStopLoss() == 0)) { {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange)を実行します。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int total = OrdersTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {。

// for (int i=0; i<OrdersTotal(); i++) { .

// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) {

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { ...

// return(True)を返します。

// }

// }

// }

// return(False)とする。

//}

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // ヒストリーの注文数

int losses=0; // ブレークのないロスカット注文の数

//ロットサイズを選択

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1).If(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.1,1);

//---- 損切り注文の回数を計算する(ブレークなし

if(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } { If(OrderSymbol()!

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

//----

if(OrderProfit()>0)break。

if(OrderProfit()<0)損失++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1)。

//---- ロットサイズを返す

if(lot<0.1)lot=0.1。

return(lot)。

}

//+------------------------------------------------------------------+

 

何が間違っているのかヒントとなるエラーコードなどは(バックテストでは)出ていますか?

panteraschoice:
#プロパティリンク "https://www.forex-tsd.com"

extern int MagicNumber = 1001;

extern bool EachTickMode = False;

extern double Lots = 0.01;

extern int Slippage = 4;

extern bool StopLossMode = True;

extern int StopLoss = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True; extern int TakeProfit = 300; extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

extern double DecreaseFactor =3;

extern int MaxOrders = 3000;

extern bool UseHourTrade = False;

extern int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#定義 SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| エキスパートスタート機能

//+------------------------------------------------------------------+

int start() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("取引時間が来ていません!");

return(0);

}

}

int Order = SIGNAL_NONE;

int Total, Ticket;

ダブルStopLossLevel、TakeProfitLevel。

int digit = MarketInfo(Symbol(),MODE_DIGITS);

if (EachTickMode && Bars != BarCount) EachTickMode = False;

Total = OrdersTotal();

オーダー = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| シグナル開始

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0)です。

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1); double sig_buy=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 注文 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| シグナル終了

//+------------------------------------------------------------------+

//買い

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)) )){

if(ScanTrades() < MaxOrders) { (ScanTrades()の場合。

//フリーマージンチェック

if (アカウントフリーマージン() < (1000 * ロット)) { { /Check free margin

Print("資金がありません。フリーマージン = ", AccountFreeMargin());

return(0);

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

チケット = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit)。

スリッページ

NormalizeDouble(StopLossLevel,digit).NormalizeDouble(StopLossLevel)です。

NormalizeDouble(TakeProfitLevel,digit)。

"買い(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(チケット > 0) {

if (オーダーセレクト(チケット, SELECT_BY_TICKET, MODE_TRADES))Print("BUY order opened : ", OrderOpenPrice()); else Print("Error opening BUY order :", GetLastError());

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//売り

if (注文 == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))。{

if(ScanTrades() < MaxOrders) { (ScanTrades()の場合。

//フリーマージンチェック

if (アカウントフリーマージン() < (1000 * ロット)) { { /Check free margin

Print("資金がありません。フリーマージン = ", AccountFreeMargin());

return(0);

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = ビッド - TakeProfit * ポイント;

チケット = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit)。

スリッページ

NormalizeDouble(StopLossLevel,digit).NormalizeDouble(StopLossLevel)。

NormalizeDouble(TakeProfitLevel,digit)。

"売り(#" + MagicNumber + ")", MagicNumber, 0, DeepPink)。

if(チケット > 0) {

if (オーダーセレクト(チケット, SELECT_BY_TICKET, MODE_TRADES))Print("SELL order opened : ", OrderOpenPrice()); else Print("Error opening SELL order :", GetLastError());

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//ポジションチェック

for (int i = 0; i < 合計; i ++) { { {オーダーセレクト(i, SELECT_BY_POS, MOD_TRADERS)

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol())) { { {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {。

//閉じる

if (オーダー == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))){

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//トレーリングストップ

if(TrailingStopMode && TrailingStop > 0) { /トレーリングストップ

if(Bid - OrderOpenPrice() > Point * TrailingStop) { { /TrailingStopMode && TrailingStop > 0

if(オーダーストップ・ロス() < ビッド - ポイント * トレーリングストップ) { { (ビッド - ポイント * トレーリングストップ)

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen)を実行します。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber))

{

//閉じる

if (オーダー == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))。

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//トレーリングストップ

if (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - Ask) > (Point * TrailingStop) ) {

if((OrderStopLoss() > (Ask + Point * TrailingStop))|| (OrderStopLoss() == 0)) { {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange)を実行します。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int total = OrdersTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {。

// for (int i=0; i<OrdersTotal(); i++) { .

// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) {

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { ...

// return(True)を返します。

// }

// }

// }

// return(False)とする。

//}

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // ヒストリーの注文数

int losses=0; // ブレークのないロスカット注文の数

//ロットサイズを選択

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1).If(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.1,1);

//---- 損切り注文の回数を計算する(ブレークなし

if(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } { If(OrderSymbol()!

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

//----

if(OrderProfit()>0)break。

if(OrderProfit()<0)損失++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1)。

//---- ロットサイズを返す

if(lot<0.1)lot=0.1。

return(lot)。

}

//+------------------------------------------------------------------+
 

今、RSIFilterだけでバックテストをしています。このスレッドで数回前にRSIMixFilterを使い、そのインディケータを公開しましたが、BUYとSELLSを得ることができますので、BUYとSELLの命令を行うロジックはOKで、問題はあなたのiCustomシグナルにあります...

RSIMixFilterは、このスレッドにはありません、すみません、ASKに あります。

panteraschoice:
今のところ買いのみで、売りの注文はありません。

誰か理由を知っていますか?

//+------------------------------------------------------------------+

//| シグナル開始

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0)です。

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1); double sig_buy=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 注文 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| シグナル終了

//+------------------------------------------------------------------+
 

2007年4月から現在までのEURUSD H1を、このRSIMixFilterだけでバックテストして みました...

90%のモデリング品質であるはずなのに、なぜ表示されないのかがわかりません。

panteraschoice:
今のところ買いのみで、売りの注文はありません。

誰か理由を知っていますか?

//+------------------------------------------------------------------+

//| 信号開始

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0)です。

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1); double sig_buy=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 注文 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| シグナル終了

//+------------------------------------------------------------------+
ファイル:
 

このバックテストでは、買いと売りの両方が出たのでしょうか、それともどちらか一方だけだったのでしょうか?私の場合、買いしか出ませんでした(コードを変えたら売りしか出ませんでした)。

私は本当にエラーを示す何も見ていない。

 
IN10TION:
今、RSIFilterだけでバックテストをしています。このスレッドの数記事前にRSIMixFilterを使い、そのインディケータを公開しましたが、BUYとSELLSを得ることができます。

ということは、これでOK?

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if ( Sg>0 ) 注文 = SIGNAL_BUY;

if (Sg<0 ) Order = SIGNAL_SELL;