package jforex;

import com.dukascopy.api.*;
import com.dukascopy.api.Configurable;
import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.IEngine;
import com.dukascopy.api.IHistory;
import com.dukascopy.api.IIndicators;
import com.dukascopy.api.IMessage.Type;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IOrder;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.IUserInterface;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.OfferSide;
import com.dukascopy.api.Period;
import java.util.*;
import java.util.ArrayList;
import java.text.NumberFormat;
import java.math.BigDecimal;
import java.math.RoundingMode;
import com.dukascopy.api.indicators.*;
import com.dukascopy.api.IIndicators.AppliedPrice;
import com.dukascopy.api.feed.*;
public class _03LongMoveSL implements IStrategy {
    @Configurable(value = "货币对", description = "货币对") 
    public Instrument minstrument = Instrument.XAUUSD;   
    @Configurable(value = "周期", description = "跟踪止损周期")
    public Period mPeriod =Period.ONE_MIN;
   @Configurable(value = "止损偏移量", description = "止损偏移量")
   public double stopLossStepPips=65;
     @Configurable(value = "止损加速", description = "止损加速")
    public double stopLossA =0.0025;
    @Configurable(value = "止损最大", description = "止损最大")
    public double  stopLossMax= 0.1;
     @Configurable(value = "监控", description = "监控")
    public boolean watchlog =false;
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;
   private List<IOrder> orderlist=new ArrayList<IOrder>();
       private IChart Chart;
    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.context = context;
        this.indicators = context.getIndicators();
        this.userInterface = context.getUserInterface();
        Chart=context.getLastActiveChart();
        console.getOut().println( Chart.getSelectedPeriod()); 
        console.getOut().println( Chart.getFeedDescriptor()); 
   
    }

    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {
    }

    public void onStop() throws JFException {
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {
     /*   if(watchlog){
          if(instrument != this.minstrument){
                return;
           }
          
           long timeFrom = history.getBar(minstrument, mPeriod, OfferSide.BID,0).getTime(); 
           long timeTo =history.getBar(minstrument, mPeriod, OfferSide.BID, 0).getTime();
           Object[] result = indicators.calculateIndicator(
           minstrument,
           mPeriod, 
           new OfferSide[] {OfferSide.BID},
           "SAR", 
           new AppliedPrice[] { AppliedPrice.CLOSE },
           new Object[] {stopLossA,stopLossMax},
           Filter.ALL_FLATS, 
           timeFrom,
           timeTo);    
           double sarValue=((double[])result[0])[0];
           console.getOut().println("止损基数:"+sarValue);
        }
        */
    }
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        try{
         if(instrument != this.minstrument || period != this.mPeriod){
            return;
          }
          double  mPipValue=instrument.getPipValue();
          long timeFrom =bidBar.getTime(); 
          long timeTo =bidBar.getTime();
          FeedDescriptor feedDescriptor = new FeedDescriptor();
          feedDescriptor.setDataType(DataType.TIME_PERIOD_AGGREGATION);        
          feedDescriptor.setFilter(Filter.ALL_FLATS);
          feedDescriptor.setInstrument(minstrument);
          feedDescriptor.setPeriod(mPeriod);
          Object[] result = indicators.calculateIndicator(
                       feedDescriptor, 
                       new OfferSide[] {OfferSide.BID},
                       "SAR", 
                       new AppliedPrice[] { AppliedPrice.CLOSE },
                       new Object[] {stopLossA,stopLossMax},
                       timeFrom,
                       timeTo);     
           double sarValue=((double[])result[0])[0];
          //对比现在价格跟SAR关系
           console.getOut().println("onBar止损基数:"+sarValue);
          //对比现在价格跟SAR关系
         if(bidBar.getClose()<sarValue){
              console.getOut().println("不能移动止损!");
              return;
          }
          double stopLoss=sarValue-stopLossStepPips*mPipValue;
          //获得订单
               orderlist = engine.getOrders(minstrument);
               if(orderlist.size()==0){
                      console.getOut().println("没有订单!");
                      return;
                 }
          BigDecimal bd=new BigDecimal(stopLoss);
          if(minstrument==instrument.XAUUSD){
                 bd=bd.setScale(2, BigDecimal.ROUND_HALF_UP);
           }
             else{
                  bd=bd.setScale(5, BigDecimal.ROUND_HALF_UP);
           }
           for(int i=0;i<orderlist.size();i++)
            {
               IOrder mo;
               mo=(IOrder)orderlist.get(i);
              if( mo.getState() == IOrder.State.FILLED&&mo.isLong())
              {
                   console.getOut().println("修改止损:"+bd);
                   mo.setStopLossPrice(Double.parseDouble(bd.toString()), OfferSide.ASK);

              }
            }  
        }
         catch (Exception e) {
               e.printStackTrace(console.getErr()); 
           }
    }
}