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.*;
import com.dukascopy.api.drawings.*;
public class _04ShortMoveSL 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 IChart Chart;
   private List<IOrder> orderlist=new ArrayList<IOrder>();
    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 {
    }
    private int dataCount = 3;
    public void onTick(Instrument instrument, ITick tick) throws JFException {
      /*  if(watchlog){
          if(instrument != this.minstrument){
                return;
           }
         FeedDescriptor feedDescriptor = new FeedDescriptor();
         feedDescriptor.setDataType(DataType.TIME_PERIOD_AGGREGATION);        
         feedDescriptor.setFilter(Filter.ALL_FLATS);
         feedDescriptor.setInstrument(minstrument);
         feedDescriptor.setPeriod(mPeriod);
           long timeFrom = history.getBar(minstrument, mPeriod, OfferSide.BID,0).getTime(); 
           long timeTo =history.getBar(minstrument, mPeriod, OfferSide.BID,0).getTime();
           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];
          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);
                  if(bidBar.getClose()>sarValue){
                      console.getOut().println("目前不能移动止损!");
                      return;
                  }
                 // console.getOut().println("SAR:"+sarValue);
                  double stopLoss=sarValue+stopLossStepPips*mPipValue;
                  //获得订单
                 
                   orderlist = engine.getOrders(minstrument);
                   if(orderlist.size()==0)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()==false)
                      {
                          console.getOut().println("修改止损:"+bd);                
                          mo.setStopLossPrice(Double.parseDouble(bd.toString()), OfferSide.BID);
                           
                      }
                    }          
           }
           catch (Exception e) {
               e.printStackTrace(console.getErr()); 
           }
    }
       
}