Exemple #1
0
func (w *Huobi) trade(emaShort, emaLong []float64, EMAMinThreshold float64,
	TresholdLevel int, length int, tradeOnlyAfterSwitch int, tradeAmount string) {
	currentTrend := getTrendAtIndex(emaShort, emaLong, EMAMinThreshold, TresholdLevel, length-1)
	logger.Debugln("currentTrend is ", currentTrend)

	if currentTrend > 1 {
		// Trend is up
		if currentTrend == 3 {
			// Trend is up, also according to the "Buy after X samples"-setting
			if (tradeOnlyAfterSwitch == 1) && (w.latestSolidTrend == 3) {
				// tradeOnlyAfterSwitch==true but the trend has not switched: Don't trade
				logger.Debugln("Trend has not switched (still up). The setting \"tradeOnlyAfterSwitch==true\", so do not trade...")
				return
			}
			w.latestSolidTrend = 3

			if Option["disable_trading"] == "1" {
				logger.Debugln("Simulted BUY (Simulation only: no trade was made)")
			} else {
				logger.Infoln("Trend has switched, 探测到买入点")
				go service.TriggerTrender("探测到买入点")

				w.Do_buy(w.getTradePrice("buy"), tradeAmount)
			}
			//logger.Infoln("Trend is up, but no " + currency + " to spend...");
		} else {
			logger.Debugf("Trend is up, but not for long enough (needs to be \"up\" for at least %d samples)\n", TresholdLevel)
		}
	} else if currentTrend < -1 {
		// Trend is down
		if currentTrend == -3 {
			// Trend is down, also according to the "Sell after X samples"-setting
			if (tradeOnlyAfterSwitch == 1) && (w.latestSolidTrend == -3) {
				// tradeOnlyAfterSwitch==true but the trend has not switched: Don't trade
				logger.Debugln("Trend has not switched (still down). The setting \"tradeOnlyAfterSwitch==true\", so do not trade...")
				return
			}
			w.latestSolidTrend = -3

			if Option["disable_trading"] == "1" {
				logger.Infoln("Simulted SELL (Simulation only: no trade was made)")
			} else {
				logger.Infoln("Trend has switched, 探测到卖出点")
				go service.TriggerTrender("探测到卖出点")

				w.Do_sell(w.getTradePrice("sell"), tradeAmount)
			}
			//logger.Infoln("Trend is down, but no BTC to sell...");
		} else {
			logger.Debugf("Trend is down, but not for long enough (needs to be \"down\" for at least t %d samples)\n", TresholdLevel)
		}
	} else {
		logger.Debugln("Trend is undefined/weak")
	}
}
Exemple #2
0
func (w *Huobi) doEMA(Time []string, Price []float64, Volumn []float64) {
	if len(Price) == 0 {
		logger.Errorln("no data is prepared!")
		return
	}
	//read config
	shortEMA, _ := strconv.Atoi(Option["shortEMA"])
	longEMA, _ := strconv.Atoi(Option["longEMA"])

	stopPoints, err := strconv.ParseFloat(Config["stopPoints"], 64)
	if err != nil {
		logger.Debugln("config item stopPoints is not float")
		return
	}

	EMAMinThreshold, err := strconv.ParseFloat(Config["EMAMinThreshold"], 64)
	if err != nil {
		logger.Debugln("config item EMAMinThreshold is not float")
		return
	}

	tradeOnlyAfterSwitch, _ := strconv.Atoi(Config["tradeOnlyAfterSwitch"])
	TresholdLevel, _ := strconv.Atoi(Config["TresholdLevel"])
	_, err = strconv.ParseFloat(Option["tradeAmount"], 64)
	if err != nil {
		logger.Debugln("config item tradeAmount is not float")
		return
	}
	tradeAmount := Option["tradeAmount"]

	f_tradeAmount, err := strconv.ParseFloat(Option["tradeAmount"], 64)
	if err != nil {
		logger.Debugln("config item tradeAmount is not float")
		return
	}

	MACDtradeAmount := fmt.Sprintf("%0.02f", f_tradeAmount/2.0)

	//compute the indictor
	emaShort := EMA(Price, shortEMA)
	emaLong := EMA(Price, longEMA)
	EMAdif := getEMAdif(emaShort, emaLong)

	length := len(Price)

	//check indictor using history data, loop through data, get history samples
	logger.OverrideStart(w.Peroid)
	logger.Overridef("EMA 收益率分析[%d:[s=%d/l=%d],stopPoints:%0.0f]\n", w.Peroid, shortEMA, longEMA, stopPoints)
	var profit float64
	var times int
	var lastTrade float64
	var entryPrice float64
	var totaltimes int

	if w.Disable_trading != 1 {
		if Config["env"] == "dev" {
			logger.Infof("%s\t%-6.2f\t%-6.2f\n", Time[length-1], Price[length-1], Volumn[length-1])
		}
	}

	//EMA cross
	for i := 1; i < length; i++ {
		if EMAdif[i-1] < 0 && EMAdif[i] > 0 { //up cross
			w.lastAction = "buyIn"
			totaltimes++
			logger.Overrideln(totaltimes)

			if times == 0 {
				entryPrice = Price[i]
			}
			times++
			profit -= Price[i]
			lastTrade = Price[i]

			w.lastBuyprice = Price[i]

			var samplesBegin int
			if i > longEMA {
				samplesBegin = i - longEMA
			} else {
				samplesBegin = 0
			}
			periodArr := Price[samplesBegin:i]

			w.lastLowestprice = arrayLowest(periodArr)

			if EMAdif[i] >= EMAMinThreshold {
				logger.Overrideln("++ buyIn", i, Time[i], Price[i], fmt.Sprintf("%0.04f", EMAdif[i]), w.lastLowestprice, 2*w.lastBuyprice-w.lastLowestprice)
			} else {
				logger.Overrideln(" + buyIn", i, Time[i], Price[i], fmt.Sprintf("%0.04f", EMAdif[i]), w.lastLowestprice, 2*w.lastBuyprice-w.lastLowestprice)
			}

			if w.checkException(Price[i-1], Price[i], Volumn[i]) == false {
				logger.Infoln("detect exception data in huobi.com", Price[i-1], Price[i], Volumn[i])
				continue
			}
			if i == length-1 && w.latestMACDTrend != 1 {
				if w.Disable_trading != 1 {
					logger.Infoln("EMA up cross, 买入buyIn", w.getTradePrice(""))
					go service.TriggerTrender("EMA up cross, 买入buyIn")
				}

				if Option["disable_trading"] != "1" && w.Disable_trading != 1 {
					w.latestMACDTrend = 1
					w.Do_buy(w.getTradePrice("buy"), tradeAmount)
				}

				w.backup(Time[i])
			}
		} else if (w.lastAction != "sellOut" || w.lastAction != "stop") && EMAdif[i-1] > 0 && EMAdif[i] < 0 { //down cross
			w.lastAction = "sellOut"
			if EMAdif[i] <= -EMAMinThreshold {
				logger.Overrideln("-- sellOut", i, Time[i], Price[i], fmt.Sprintf("%0.04f", EMAdif[i]))
			} else {
				logger.Overrideln(" - sellOut", i, Time[i], Price[i], fmt.Sprintf("%0.04f", EMAdif[i]))
			}

			if w.checkException(Price[i-1], Price[i], Volumn[i]) == false {
				logger.Infoln("detect exception data in huobi.com", Price[i-1], Price[i], Volumn[i])
				continue
			}

			if i == length-1 && w.latestMACDTrend != -1 {
				if w.Disable_trading != 1 {
					logger.Infoln("EMA down cross, 卖出sellOut", w.getTradePrice(""))
					go service.TriggerTrender("EMA down cross, 卖出sellOut")
				}
				if Option["disable_trading"] != "1" && w.Disable_trading != 1 {
					w.latestMACDTrend = -1
					ret := w.Do_sell(w.getTradePrice("sell"), tradeAmount)
					if ret == false {
						w.Do_sell(w.getTradePrice("sell"), MACDtradeAmount)
					}
				}

				w.backup(Time[i])
			}

			if times != 0 {
				times++
				profit += Price[i]
				lastTrade = Price[i]
				if times != 0 && times%2 == 0 {
					logger.Overridef("profit=%0.02f, rate=%0.02f%%\n", Price[i]-w.lastBuyprice, 100*(Price[i]-w.lastBuyprice)/w.lastBuyprice)
				}
			}
		} /* else if (w.lastAction != "exit" || w.lastAction != "stop") && Price[i] < emaMiddle[i]-stopPoints { //stop
			w.lastAction = "stop"
			logger.Overrideln("-- stop", i, Time[i], Price[i], fmt.Sprintf("%0.04f", emaMiddle[i]))
			if i == length-1 && w.latestMACDTrend != -1 {
				logger.Infoln("保守止损位", w.getTradePrice(""))
				go service.TriggerTrender("保守止损位")

				ret := w.do_sell(w.getTradePrice("sell"), tradeAmount)
				if ret == false {
					w.do_sell(w.getTradePrice("sell"), MACDtradeAmount)
				}
			}

			if times != 0 {
				times++
				profit += Price[i]
				lastTrade = Price[i]
				if times != 0 && times%2 == 0 {
					logger.Overridef("profit=%0.02f, rate=%0.02f%%\n", Price[i]-w.lastBuyprice, 100*(Price[i]-w.lastBuyprice)/w.lastBuyprice)
				}
			}
		}*/

	}

	if times%2 != 0 {
		profit += lastTrade
		totaltimes--
	}
	logger.Overridef("totaltimes[%d] profit=%0.02f, entryPrice=%0.02f, rate=%0.02f%%\n", totaltimes, profit, entryPrice, 100*profit/entryPrice)

	if false {
		//current trend
		//trade according trend indictor
		if w.latestSolidTrend == 0 {
			w.findLatestSolidTrend(emaShort, emaLong, EMAMinThreshold,
				TresholdLevel, length)
		}

		w.trade(emaShort, emaLong, EMAMinThreshold,
			TresholdLevel, length, tradeOnlyAfterSwitch, tradeAmount)
	}
}
Exemple #3
0
func (w *Huobi) doMACD(Time []string, Price []float64) {
	if len(Price) == 0 {
		return
	}
	//read config
	shortEMA, _ := strconv.Atoi(Config["shortEMA"])
	middleEMA, _ := strconv.Atoi(Config["middleEMA"])
	longEMA, _ := strconv.Atoi(Config["longEMA"])

	signalPeriod, _ := strconv.Atoi(Config["signalPeriod"])
	MACDMinThreshold, err := strconv.ParseFloat(Config["MACDMinThreshold"], 64)
	if err != nil {
		logger.Debugln("config item MACDMinThreshold is not float")
		return
	}

	tradeAmount := Config["MACDtradeAmount"]

	//compute the indictor
	emaShort := EMA(Price, shortEMA)
	emaMiddle := EMA(Price, middleEMA)
	emaLong := EMA(Price, longEMA)
	MACDdif := getMACDdif(emaShort, emaLong)
	MACDSignal := getMACDSignal(MACDdif, signalPeriod)
	MACDHistogram := getMACDHistogram(MACDdif, MACDSignal)

	length := len(Price)

	logger.OverrideStart(w.Peroid)

	logger.Overridef("macd cross分析[%d/%d]\n", shortEMA, longEMA)
	//macd cross
	for i := 1; i < length; i++ {
		if MACDHistogram[i-1] < 0 && MACDHistogram[i] > 0 {
			if MACDHistogram[i]-MACDHistogram[i-1] >= 0 && Price[i] > emaMiddle[i] {
				logger.Overrideln("++", i, Time[i], Price[i], fmt.Sprintf("%0.02f", MACDSignal[i]))
			} else {
				logger.Overrideln(" +", i, Time[i], Price[i], fmt.Sprintf("%0.02f", MACDSignal[i]))
			}
			if i == length-1 && w.latestMACDTrend != 1 && MACDSignal[i] < -MACDMinThreshold {
				w.latestMACDTrend = 1
				logger.Infoln("MACD has switched, 探测到买入点", w.getTradePrice("buy"))
				go service.TriggerTrender("MACD has switched, 探测到买入点")

				w.Do_buy(w.getTradePrice("buy"), tradeAmount)
			}
		} else if MACDHistogram[i-1] > 0 && MACDHistogram[i] < 0 {
			if MACDHistogram[i]-MACDHistogram[i-1] <= 0 && Price[i] < emaMiddle[i] {
				logger.Overrideln("--", i, Time[i], Price[i], fmt.Sprintf("%0.02f", MACDSignal[i]))
			} else {
				logger.Overrideln(" -", i, Time[i], Price[i], fmt.Sprintf("%0.02f", MACDSignal[i]))
			}
			if i == length-1 && w.latestMACDTrend != -1 && MACDSignal[i] > MACDMinThreshold {
				w.latestMACDTrend = -1
				logger.Infoln("MACD has switched, 探测到卖出点", w.getTradePrice("sell"))
				go service.TriggerTrender("MACD has switched, 探测到卖出点")

				w.Do_sell(w.getTradePrice("sell"), tradeAmount)
			}
		}
	}
}