2014年6月30日月曜日

ポジション数、ロット数、損益などを計算する関数


エントリーやエグジット部分のプログラムは、ストラテジー(EA)の手法次第で、それぞれのストラテジーにより異なりますが、ポジションの数、ロット数、損益等の情報を参照する部分のプログラムは、多くのストラテジーでほぼ同じ形に集約されます。これからご紹介する、複数のストラテジーで共通化して使うことができるポジション関連のプログラム等は、関数として作成しておくと、後日新しいストラテジー作成時にそのまま使ったり、必要に応じて少し変えるだけで使うことができる、便利な関数です。

この関数は以下のポジション情報を計算します。
買い/売りポジション数
買い/売りポジションのロット数
買い/売りポジションの損益
買い/売り指値未約定注文数
買い/売りストップ未約定注文数



コード説明

void OnTick(){
int longPos, shortPos, longPendOrders, shortPendOrders, longLimitPendOrders, longStopPendOrders, shortLimitPendOrders, shortStopPendOrders;
double longLots, shortLots, longProfit, shortProfit;

関数呼び出し前に、関数で使うパラメータを宣言します。ポジション数などは整数なのでintで、ロット数は千通貨の場合0.01ロットで小数になるのでdoubleで宣言します。


positionsInfo(longPos, shortPos, longPendOrders, shortPendOrders, longLots, shortLots, longProfit, shortProfit, longLimitPendOrders, longStopPendOrders, shortLimitPendOrders, shortStopPendOrders);
}

関数に適切な順番にパラメータを入れて関数呼び出します。「適切な順番」は、以下の「void positionsInfo()」以下でパラメータを書いた順序です。
これでOnTick内で好きな時に、関数で計算したポジション情報を参照することができます。


void positionsInfo(
int &longPos,
int &shortPos,
int &longPendOrders,
int &shortPendOrders,
double &longLots,
double &shortLots,
double &longProfit,
double &shortProfit,
int &longLimitPendOrders,
int &longStopPendOrders,
int &shortLimitPendOrders,
int &shortStopPendOrders
 ){

関数のパラメータの前に「&」を付けることで参照渡しになります。これにより一度に複数の値を戻すことができます。


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

全注文の中で、


     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

ポジションによる識別の場合、


     if(OrderSymbol() != Symbol() && OrderMagicNumber() != 11111) continue;

また銘柄とマジック番号が同じ場合、


     if (OrderType() == OP_BUY){
         longPos ++;
         longLots += OrderLots();
         longProfit += OrderProfit();    
     }else

買いポジション、買いポジションのロット数、買いポジションの損益を計算。

     if (OrderType() == OP_SELL){
         shortPos ++;
         shortLots += OrderLots();
         shortProfit += OrderProfit();   
     }else

売りポジション、売りポジションのロット数、売りポジションの損益を計算。


     if (OrderType() == OP_BUYLIMIT){
         longLimitPendOrders ++;    
     }else

買い指値未約定注文数を計算。


     if (OrderType() == OP_BUYSTOP){
         longStopPendOrders ++;    
     }else

買いストップ未約定注文数を計算。


     if (OrderType() == OP_SELLLIMIT){
         shortLimitPendOrders ++;    
     }else

売り指値未約定注文を計算。


     if (OrderType() == OP_SELLSTOP){  
         shortStopPendOrders ++;   
 
売りストップ未約定注文を計算。

コード全体

void OnTick()
{
int longPos, shortPos, longPendOrders, shortPendOrders, longLimitPendOrders, longStopPendOrders, shortLimitPendOrders, shortStopPendOrders;
double longLots, shortLots, longProfit, shortProfit;

positionsInfo(longPos, shortPos, longPendOrders, shortPendOrders, longLots, shortLots, longProfit, shortProfit, longLimitPendOrders, longStopPendOrders, shortLimitPendOrders, shortStopPendOrders);
}

void positionsInfo(
int &longPos,
int &shortPos,
int &longPendOrders,
int &shortPendOrders,
double &longLots,
double &shortLots,
double &longProfit,
double &shortProfit,
int &longLimitPendOrders,
int &longStopPendOrders,
int &shortLimitPendOrders,
int &shortStopPendOrders
 ){
   for( int i=0; i<OrdersTotal(); i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol() != Symbol() && OrderMagicNumber() != 11111) continue;
     if (OrderType() == OP_BUY){
         longPos ++;
         longLots += OrderLots();
         longProfit += OrderProfit();    
     }else
     if (OrderType() == OP_SELL){
         shortPos ++;
         shortLots += OrderLots();
         shortProfit += OrderProfit();   
     }else
     if (OrderType() == OP_BUYLIMIT){
         longLimitPendOrders ++;    
     }else
     if (OrderType() == OP_BUYSTOP){
         longStopPendOrders ++;    
     }else
     if (OrderType() == OP_SELLLIMIT){
         shortLimitPendOrders ++;    
     }else
     if (OrderType() == OP_SELLSTOP){  
         shortStopPendOrders ++;    
     }
  }
}

2014年6月10日火曜日

前日高値または安値をブレークしたらエントリーするブレークアウトEA

前日高値または安値の上下に任意のpips数離した価格に買いまたは売りストップ注文を出すEAです。通常0時が日替わり時間(日足が始まる時間)であるがために、高安の計算もその時間を基準にして計算させることが多いですが、このEAは一日の日替わり時間を任意の時間に指定できます。例えば6時に設定すれば、6時0分0秒以降次の日の5時59分59秒までのティックで高安を計算します。

あくまでMQL4学習のためのサンプルコードです。今回はこのEAがどの通貨ペアやインターバルに最適なのかなど銘柄の推奨になるような、バックテストや最適化の検証結果には触れません。

サンプルをベースにご自身の好きなように変更してみてください。

■エントリールール

新規買
前日高値のNpips上に買いのストップ注文を発注
新規売
前日安値のNpips下に売りのストップ注文を発注

■エグジットルール

決済売
新規買価格よりMpips下に損切りのストップ注文を、Npips上に利益確定の指値注文を発注。また日替わり時間にポジションが残っていれば全決済。
決済買
新規買価格よりMpips上に損切りのストップ注文を、Npips下に利益確定の指値注文を発注。また日替わり時間にポジションが残っていれば全決済。

■コード説明

input double Lots = 0.1;
input int Break = 50;
input int Stop = 300;
input int Profit = 300;
input int StartHour = 7;
input int StartTime = 0;


Lots - ロット数設定
Break – 前日の高値/安値計算後、その上下に加算/減算するピップ数で50は5pips
Stop - エントリー約定価格からの損切りpips数で300は30pips
Profit - エントリー約定価格からの利益確定pips数で300は30pips
StartHour – 前日の高値/安値の計算開始時間で7は7時
StattTime – 前日の高値/安値の計算開始時間で0は7時0分

if (timeToSeconds(TimeCurrent()) == (startHourSec + startTimeSec)){
現在時間が日替わり時間であれば(7時の場合には7時から7時1分までの間に)

count++;

ティック数をカウントする

if (longPos > 0 || shortPos > 0)
closePositions();

買いポジションまたは売りポジションがある場合全てのポジションを決済する

if (count == 1){

最初のティックのときに

lastHH = hh;
lastLL = ll;

前日高値と安値を変数に格納する

hh = 0.1;
ll = 9999.0;

本日の高値と安値の計算のために変数を初期値に戻す

}else{

日替わり時間外であれば

if (longPos == 0 && shortPos == 0 && pendOrders == 0 && entryDone == false){

買いポジション、売りポジション、未約定注文がない、そして本日まだエントリーがない場合

            if (lastHH > 1){
               lastHH = MathMax(lastHH+breakPoint, Ask + sl);
               longTicket = OrderSend(Symbol(), OP_BUYSTOP, Lots, lastHH , 0, 0, 0, "BBreak", MagicNumber,0,Green);
            }

前日高値とストップレベルを比較して高い方を買いのストップ注文価格にして、買いのストップ注文を発注する

            if (lastLL < 9998.0){
               lastLL = MathMin(lastLL-breakPoint, Bid - sl);
               shortTicket = OrderSend(Symbol(), OP_SELLSTOP, Lots, lastLL , 0, 0, 0, "SBreak", MagicNumber,0,Red);
            }    

前日安値とストップレベルを比較して安い方を売りのストップ注文価格にして、売りのストップ注文を発注する

if (longPos > 0){

買いのストップ注文が約定して買いポジションを持っている場合

cancelPendingOrders();

売りのストップ注文を取消す

stopPrice = openPrice - stopPoint;
profitPrice = openPrice + profitPoint;

エントリー価格からの損切りと利益確定注文価格の計算

ticketMod = OrderModify(longTicket, openPrice, stopPrice, profitPrice, 0, Blue);

買いポジションに対して、損切りと利益確定注文を発注

if (shortPos > 0){

売りのストップ注文が約定して売りポジションを持っている場合

cancelPendingOrders();

売りのストップ注文を取消す

stopPrice = openPrice + stopPoint;
profitPrice = openPrice - profitPoint;

エントリー価格からの損切りと利益確定注文価格の計算

ticketMod = OrderModify(shortTicket, openPrice, stopPrice, profitPrice, 0, Magenta);

売りポジションに対して、損切りと利益確定注文を発注

hh = MathMax(hh,High[0]);
ll = MathMin(ll,Low[0]);

本日の高値と安値を計算する

以下からはユーザー定義関数で、主に上のメインの計算で使用する
int timeToSeconds(datetime time){
   int tts = TimeHour(time)*60*60 + TimeMinute(time)*60;
   return(tts);
}

時間を分数に変える計算で次のbreakCalcTimeで使う


void positionInfo(int &longPos, int &shortPos, int &pendOrders, double &openPrice){
   int i;
   for( i=0; i<OrdersTotal(); i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
     if(OrderType() == OP_BUY){
        longPos++;
        openPrice = OrderOpenPrice();
     }else
     if(OrderType() == OP_SELL){
        shortPos++;
        openPrice = OrderOpenPrice();
     }else
        pendOrders++;
   }
}

買いポジション数、売りポジション数、未約定注文、約定価格を計算してOnTick()内で使う


void cancelPendingOrders(){
   int i;
   bool ticketDel;
   for( i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
      ticketDel = false;
      if (OrderType() != OP_BUY && OrderType() != OP_SELL)
         ticketDel = OrderDelete( OrderTicket() );

   }
}

未約定注文を取消す関数でOnTick()内で使う


void closePositions(){
   int i;
   bool ticketClose;
   for( i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
      ticketClose = false;
      if (OrderType() == OP_BUY)
         ticketClose = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, Cyan);
      else
      if (OrderType() == OP_SELL)
         ticketClose = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, White);
   }
}

オープンポジションを決済する関数でOnTick()内で使う

■コード全体

input double Lots = 0.1;
input int Break = 50;
input int Stop = 300;
input int Profit = 300;
input int StartHour = 7;
input int StartTime = 0;
input int MagicNumber = 8888;

int startHourSec = StartHour*60*60, startTimeSec = StartTime*60, longTicket, shortTicket, ticketMod;
double hh = 0.1, ll = 9999.0, lastHH = 0.1, lastLL = 9999.0, p = Point, breakPoint = Break*p, stopPoint = Stop*p, profitPoint = Profit*p, sl = 0;
static int count = 0;
bool entryDone = false;

void OnTick()
  {
   int longPos, shortPos, pendOrders;
   double openPrice, stopPrice, profitPrice;
  
   sl = MarketInfo(Symbol(), MODE_STOPLEVEL)*p;
   positionInfo(longPos, shortPos, pendOrders, openPrice);
        
     
   if (timeToSeconds(TimeCurrent()) == (startHourSec + startTimeSec)){
      count++;
      if (longPos > 0 || shortPos > 0)
         closePositions();
      if (count == 1){
         entryDone = False;
         lastHH = hh;
         lastLL = ll;
         hh = 0.1;
         ll = 9999.0;
      }
   }else{
      count = 0;
         if (longPos == 0 && shortPos == 0 && pendOrders == 0 && entryDone == false){
            ticketMod = false;
            if (lastHH > 1){
               lastHH = MathMax(lastHH+breakPoint, Ask + sl);
               longTicket = OrderSend(Symbol(), OP_BUYSTOP, Lots, lastHH , 0, 0, 0, "BBreak", MagicNumber,0,Green);
            }
            if (lastLL < 9998.0){
               lastLL = MathMin(lastLL-breakPoint, Bid - sl);
               shortTicket = OrderSend(Symbol(), OP_SELLSTOP, Lots, lastLL , 0, 0, 0, "SBreak", MagicNumber,0,Red);
            }     
         }
  
         if (longPos > 0){
            cancelPendingOrders();
            stopPrice = openPrice - stopPoint;
            profitPrice = openPrice + profitPoint;
            if (!ticketMod)
               ticketMod = OrderModify(longTicket, openPrice, stopPrice, profitPrice, 0, Blue);
            entryDone = true;
         }else
         if (shortPos > 0){
            cancelPendingOrders();
            stopPrice = openPrice + stopPoint;
            profitPrice = openPrice - profitPoint;
            if (!ticketMod)  
               ticketMod = OrderModify(shortTicket, openPrice, stopPrice, profitPrice, 0, Magenta);
            entryDone = true;
         }
   }
      hh = MathMax(hh,High[0]);
      ll = MathMin(ll,Low[0]); 

}
//+------------------------------------------------------------------+
int timeToSeconds(datetime time){
   int tts = TimeHour(time)*60*60 + TimeMinute(time)*60;
   return(tts);
}

void positionInfo(int &longPos, int &shortPos, int &pendOrders, double &openPrice){
   int i;
   for( i=0; i<OrdersTotal(); i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
     if(OrderType() == OP_BUY){
        longPos++;
        openPrice = OrderOpenPrice();
     }else
     if(OrderType() == OP_SELL){
        shortPos++;
        openPrice = OrderOpenPrice();
     }else
        pendOrders++;
   }
}

void cancelPendingOrders(){
   int i;
   bool ticketDel;
   for( i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
      ticketDel = false;
      if (OrderType() != OP_BUY && OrderType() != OP_SELL)
         ticketDel = OrderDelete( OrderTicket() );

   }
}

void closePositions(){
   int i;
   bool ticketClose;
   for( i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
      ticketClose = false;
      if (OrderType() == OP_BUY)
         ticketClose = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, Cyan);
      else
      if (OrderType() == OP_SELL)
         ticketClose = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, White);
   }
}

2014年6月4日水曜日

指定した時間からN分後までの高安をブレークしたらエントリーするブレークアウトEA

指定した期間の最高値/最安値を上抜く/下抜くというルールのEAはよく見かけるので、指定した時間(15時など)から指定した分数間(120分間など)の最高値/最安値を上抜く/下抜いたら、というルールでEAを作ってみました。
あくまでMQL4学習のためのサンプルコードです。今回はこのEAがどの通貨ペアやインターバルに最適なのかなど銘柄の推奨になるような、バックテストや最適化の検証結果には触れません。
サンプルをベースにご自身の好きなように変更してみてください。

■エントリールール

新規買
N時からY分間の最高値を計算。その最高値からZpips上に買いのストップ注文を発注
新規売
N時からY分間の最安値を計算。その最安値からZpips下に売りのストップ注文を発注

■エグジットルール

決済売
新規買価格よりMpips下に損切りのストップ注文を、Npips上に利益確定の指値注文を発注
決済買
新規買価格よりMpips上に損切りのストップ注文を、Npips下に利益確定の指値注文を発注

■コード説明

extern double Lots = 1;
extern int Break = 50;
extern int Stop = 300;
extern int Profit = 300;
extern int StartHour = 15;
extern int StattTime = 0;
extern int CalcMinutes = 120;


Lots - ロット数設定
Break - 最高値/最安値計算後、その上下に加算/減算するピップ数50は5pips
Stop - エントリー約定価格からの損切りpips数で300は30pips
Profit - エントリー約定価格からの利益確定pips数で300は30pips
StartHour - 最高値/最安値の計算開始時間で15は15時
StattTime - 最高値/最安値の計算開始時間で0は15時0分
CalcMinutes - 最高値/最安値の計算開始時間からの経過分数で、最高値/最安値の計算終了時間になる

sl = MarketInfo(Symbol(), MODE_STOPLEVEL)*p;
ブローカーのストップ注文や指値注文の最低幅(ストップレベル)を確認


positionInfo(longPos, shortPos, pendOrders, openPrice);
買いポジション数、売りポジション数、未約定注文、約定価格を計算


if (longPos == 0 && shortPos == 0 && pendOrders == 0){
買いポジション、売りポジション、未約定注文がない場合


if (breakCalcTime()){
ブレークアウト時間内であれば


hh = MathMax(hh,High[0]);
ll = MathMin(ll,Low[0]);

最高値と最安値を計算する


}else{
ブレークアウト時間外であれば


hh = MathMax(hh + breakPoint, Ask + sl);
最高値とストップレベルを比較して高い方を買いのストップ注文価格にする


longTicket = OrderSend(Symbol(), OP_BUYSTOP, Lots, hh , 0, 0, 0, "BBreak", MagicNumber,0,Green);
買いのストップ注文を発注する


ll = MathMin(ll - breakPoint, Bid - sl);
最安値とストップレベルを比較して安い方を売りのストップ注文価格にする


shortTicket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ll , 0, 0, 0, "SBreak", MagicNumber,0,Red);
売りのストップ注文を発注する


if (longPos > 0){
買いのストップ注文が約定して買いポジションを持っている場合


cancelPendingOrders();
売りのストップ注文を取消す


stopPrice = openPrice - stopPoint;
profitPrice = openPrice + profitPoint;

エントリー価格からの損切りと利益確定注文価格の計算


ticketMod = OrderModify(longTicket, openPrice, stopPrice, profitPrice, 0, Blue);
買いポジションに対して、損切りと利益確定注文を発注


if (shortPos > 0){
売りのストップ注文が約定して売りポジションを持っている場合


cancelPendingOrders();
売りのストップ注文を取消す


stopPrice = openPrice + stopPoint;
profitPrice = openPrice - profitPoint;

エントリー価格からの損切りと利益確定注文価格の計算


ticketMod = OrderModify(shortTicket, openPrice, stopPrice, profitPrice, 0, Magenta);
売りポジションに対して、損切りと利益確定注文を発注




以下からはユーザー定義関数で、主に上のメインの計算で使用する
int timeToSeconds(datetime time){
   int tts = TimeHour(time)*60*60 + TimeMinute(time)*60;
   return(tts);
}

時間を分数に変える計算で次のbreakCalcTimeで使う



bool breakCalcTime(){
   datetime tc = TimeCurrent();
   if (timeToSeconds(tc) - (StartHour*60*60 + StattTime*60) >= 0){
      if (timeToSeconds(tc) >= (StartHour*60*60 + StattTime*60) && timeToSeconds(tc) <= StartHour*60*60 + StattTime*60 + CalcMinutes*60){
         return(true);
      }else
         return(false);
   }else{
      if ((timeToSeconds(tc) >= (StartHour*60*60 + StattTime*60) && timeToSeconds(tc) <= 86400) ||
      (timeToSeconds(tc) >= 0 && timeToSeconds(tc) <=  (StartHour*60*60 + StattTime*60 + CalcMinutes*60) - 86400)){
         return(true);
      }else
         return(false);
   }   
}

足の時間がブレークアウト時間内であることを計算して上で使う



void positionInfo(int &longPos, int &shortPos, int &pendOrders, double &openPrice){
   int i;
   for( i=0; i<OrdersTotal(); i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
     if(OrderType() == OP_BUY){
        longPos++;
        openPrice = OrderOpenPrice();
     }else
     if(OrderType() == OP_SELL){
        shortPos++;
        openPrice = OrderOpenPrice();
     }else
        pendOrders++;
   }
}

買いポジション数、売りポジション数、未約定注文、約定価格を計算して上で使う



void cancelPendingOrders(){
   int i;
   bool ticketDel;
   for( i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
      ticketDel = false;
      if (OrderType() != OP_BUY && OrderType() != OP_SELL)
         ticketDel = OrderDelete( OrderTicket() );

   }
}

未約定注文を取消す関数で上で使う

■コード全体

#property copyright ""
#property link      ""
#property version   "1.00"
#property strict

extern double Lots = 1;
extern int Break = 50;
extern int Stop = 300;
extern int Profit = 300;
extern int StartHour = 15;
extern int StattTime = 0;
extern int CalcMinutes = 120;
extern int MagicNumber = 777;


int barsTotal, longTicket, shortTicket, ticketMod;
double hh = 0.1, ll = 9999.0, p = Point, breakPoint = Break*p, stopPoint = Stop*p, profitPoint = Profit*p, sl = 0;

void OnTick()
  {
  int longPos, shortPos, pendOrders;
  double openPrice, stopPrice, profitPrice;
//---
   sl = MarketInfo(Symbol(), MODE_STOPLEVEL)*p;
   positionInfo(longPos, shortPos, pendOrders, openPrice);
      if (longPos == 0 && shortPos == 0 && pendOrders == 0){
         ticketMod = false;
         if (breakCalcTime()){
            hh = MathMax(hh,High[0]);
            ll = MathMin(ll,Low[0]);
         }else{
            if (hh > 1){
               hh = MathMax(hh + breakPoint, Ask + sl);
               longTicket = OrderSend(Symbol(), OP_BUYSTOP, Lots, hh , 0, 0, 0, "BBreak", MagicNumber,0,Green);
            }
            if (ll < 9998.0){
               ll = MathMin(ll - breakPoint, Bid - sl);
               shortTicket = OrderSend(Symbol(), OP_SELLSTOP, Lots, ll , 0, 0, 0, "SBreak", MagicNumber,0,Red);
            }
         }
      }

      if (longPos > 0){
         cancelPendingOrders();
         stopPrice = openPrice - stopPoint;
         profitPrice = openPrice + profitPoint;
         if (!ticketMod)
            ticketMod = OrderModify(longTicket, openPrice, stopPrice, profitPrice, 0, Blue);
         hh = 0.1; ll = 9999.0;
      }else
      if (shortPos > 0){
         cancelPendingOrders();
         stopPrice = openPrice + stopPoint;
         profitPrice = openPrice - profitPoint;
         if (!ticketMod)  
            ticketMod = OrderModify(shortTicket, openPrice, stopPrice, profitPrice, 0, Magenta);
         hh = 0.1; ll = 9999.0; 
      }       
  }

int timeToSeconds(datetime time){
   int tts = TimeHour(time)*60*60 + TimeMinute(time)*60;
   return(tts);
}

bool breakCalcTime(){
   datetime tc = TimeCurrent();
   if (timeToSeconds(tc) - (StartHour*60*60 + StattTime*60) >= 0){
      if (timeToSeconds(tc) >= (StartHour*60*60 + StattTime*60) && timeToSeconds(tc) <= StartHour*60*60 + StattTime*60 + CalcMinutes*60){
         return(true);
      }else
         return(false);
   }else{
      if ((timeToSeconds(tc) >= (StartHour*60*60 + StattTime*60) && timeToSeconds(tc) <= 86400) ||
      (timeToSeconds(tc) >= 0 && timeToSeconds(tc) <=  (StartHour*60*60 + StattTime*60 + CalcMinutes*60) - 86400)){
         return(true);
      }else
         return(false);
   }   
}

void positionInfo(int &longPos, int &shortPos, int &pendOrders, double &openPrice){
   int i;
   for( i=0; i<OrdersTotal(); i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
     if(OrderType() == OP_BUY){
        longPos++;
        openPrice = OrderOpenPrice();
     }else
     if(OrderType() == OP_SELL){
        shortPos++;
        openPrice = OrderOpenPrice();
     }else
        pendOrders++;
   }
}

void cancelPendingOrders(){
   int i;
   bool ticketDel;
   for( i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol() != Symbol() && OrderMagicNumber() != MagicNumber) continue;
      ticketDel = false;
      if (OrderType() != OP_BUY && OrderType() != OP_SELL)
         ticketDel = OrderDelete( OrderTicket() );

   }
}